NestJS là một trong những framework Node.js nổi bật và đã nhận được sự yêu thích đáng kể từ các lập trình viên. NestJS cung cấp khả năng xây dựng ứng dụng web hiện đại với việc tạo REST API một cách dễ dàng, giúp tương tác dữ liệu với các máy chủ một cách hiệu quả.
Giới Thiệu Về NestJS
NestJS là một framework phát triển ứng dụng Node.js có cấu trúc rõ ràng, dựa trên các nguyên lý mạnh mẽ của Angular. Sử dụng TypeScript - một phiên bản cải tiến của JavaScript - NestJS giúp kiểm soát mã nguồn và triển khai dễ dàng. Nhờ vào việc áp dụng mô hình kiến trúc lõi, cấu trúc module, và dependency injection, NestJS hướng đến việc cung cấp một cấu trúc ứng dụng dễ quản lý, từ đó nâng cao tính bảo trì và sự tổ chức của mã nguồn.
Trong bài viết này, chúng ta sẽ cùng nhau khám phá các bước để tạo REST API với NestJS, Prisma, và PostgreSQL.
Các Công Nghệ Sẽ Được Sử Dụng:
- Backend Framework: NestJS
- Object-Relational Mapper (ORM): Prisma
- Cơ Sở Dữ Liệu: PostgreSQL
- Ngôn Ngữ Lập Trình: TypeScript
Các Bước Cơ Bản Để Xây Dựng REST API:
- Tạo một dự án NestJS mới.
- Khởi tạo máy chủ PostgreSQL và kết nối với nó thông qua Prisma.
- Xây dựng các API cần thiết.
Các Bước Thực Hiện
1. Thiết Lập Môi Trường
- Cài đặt Node.js.
- Cài đặt PostgreSQL.
- Cài đặt Extension: Prisma cho VSCode (không bắt buộc).
2. Tạo Dự Án NestJS
Để bắt đầu, bạn cần cài đặt NestJS CLI. Chạy lệnh sau tại thư mục mà bạn muốn tạo dự án:
npx @nestjs/cli new nest-starter
CLI sẽ yêu cầu bạn chọn trình quản lý gói cho dự án (chọn npm
). Sau đó, một dự án NestJS mới sẽ được tạo trong thư mục hiện tại với các tệp sau:
nest-starter
├── node_modules
├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── README.md
├── nest-cli.json
├── package-lock.json
├── package.json
├── tsconfig.build.json
└── tsconfig.json
Mã nguồn chủ yếu sẽ nằm trong thư mục src
.
Một số tệp quan trọng đáng chú ý là:
src/app.module.ts
: Mô-đun gốc của ứng dụng.src/app.controller.ts
: Controller cơ bản với route:/
, sẽ trả về 'Hello world!'.src/main.ts
: Điểm khởi đầu của ứng dụng, nơi khởi động NestJS.
Bạn có thể khởi động server bằng lệnh sau:
npm run start:dev
Lệnh này sẽ theo dõi các tệp trong dự án, tự động biên dịch lại và reload server khi có thay đổi. Truy cập URL http://localhost:3000/ để xem thông điệp 'Hello World!'.
3. Thiết Lập Prisma
Hãy đảm bảo rằng PostgreSQL đã được cài đặt và sẵn sàng hoạt động!
Khởi Tạo Prisma
Cài đặt Prisma bằng lệnh:
npm install -D prisma
Khởi tạo Prisma trong dự án của bạn với lệnh:
npx prisma init
Lệnh này sẽ tạo ra một thư mục prisma
cùng với tệp schema.prisma
, là tệp cấu hình cho cơ sở dữ liệu, đồng thời cũng tạo ra tệp .env
trong dự án.
Cấu Hình Biến Môi Trường
Thay đổi biến DATABASE_URL
để kết nối đến PostgreSQL. Ví dụ:
DATABASE_URL="postgresql://myuser:password@localhost:5432/mydb?schema=nest-db"
Các Thành Phần Trong Prisma Schema
prisma
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Tệp này định nghĩa schema cho cơ sở dữ liệu với ba thành phần chính: Data source, Generator, và Data model (chúng ta sẽ xem xét ở phần sau).
Mô Hình Dữ Liệu
Trong dự án này, chúng ta sẽ làm việc với mô hình User
. Thêm mô hình này vào tệp prisma/schema.prisma
như sau:
prisma
model User {
id Int @id @default(autoincrement())
name String
email String @unique
address String?
isActive Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Mô hình User
bao gồm các trường như id
, name
, email
, và address
, cùng với các thuộc tính bổ sung. Trường id
được xác định là khóa chính và tự động tăng.
Di Chuyển Cơ Sở Dữ Liệu
Chạy lệnh sau để tạo bảng trong cơ sở dữ liệu:
npx prisma migrate dev --name "init"
Lệnh này sẽ thực hiện các bước lưu migration, thực thi migration, và sinh ra Prisma Client.
Seed Dữ Liệu
Tạo tệp prisma/seed.ts
và thêm đoạn mã mẫu để tạo dữ liệu cho bảng User:
// prisma/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
const user1 = await prisma.user.upsert({
where: { email: 'nguyenvana@prisma.io' },
update: {},
create: {
email: 'nguyenvana@prisma.io',
name: 'Nguyen Van A',
address: 'Ha Noi',
},
});
const user2 = await prisma.user.upsert({
where: { email: 'nguyenvanb@prisma.io' },
update: {},
create: {
email: 'nguyenvanb@prisma.io',
name: 'Nguyen Van B',
isActive: true,
},
});
console.log({ user1, user2 });
}
main()
.then(async () => {
await prisma.$disconnect();
})
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
Sau đó, điều chỉnh package.json
để thực thi seed:
json
// package.json
"prisma": {
"seed": "ts-node prisma/seed.ts"
}
Chạy lệnh sau để khởi tạo dữ liệu mẫu:
npx prisma db seed
Bạn sẽ thấy hai bản ghi đã được tạo thành công.
Tạo Prisma Service trong NestJS
Để giữ cho Prisma Client API được tổ chức tốt trong ứng dụng, hãy tạo một dịch vụ PrismaService
. Chạy lệnh sau:
npx nest generate module prisma
npx nest generate service prisma
Trong tệp src/prisma/prisma.service.ts
, khởi tạo PrismaClient
như sau:
typescript
import { Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient {}
Đảm bảo rằng PrismaService
được xuất ra trong prisma.module.ts
để có thể sử dụng ở các module khác.
Kết Luận
Chúng ta đã hoàn tất việc thiết lập Prisma, tạo bảng User
, và dữ liệu mẫu để chuẩn bị cho việc viết các API CRUD trong phần tiếp theo. Hãy theo dõi phần 2 nhé! Cảm ơn mọi người đã theo dõi bài viết của mình và hẹn gặp lại!
source: viblo