0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Xây Dựng REST API Bằng NestJS và Prisma (Phần 1)

Đăng vào 2 tuần trước

• 5 phút đọc

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:

  1. Tạo một dự án NestJS mới.
  2. Khởi tạo máy chủ PostgreSQL và kết nối với nó thông qua Prisma.
  3. 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:

Copy
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:

Copy
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:

Copy
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:

Copy
npm install -D prisma

Khởi tạo Prisma trong dự án của bạn với lệnh:

Copy
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ụ:

Copy
DATABASE_URL="postgresql://myuser:password@localhost:5432/mydb?schema=nest-db"

Các Thành Phần Trong Prisma Schema

prisma Copy
// 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 Copy
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:

Copy
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:

Copy
// 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 Copy
// package.json
"prisma": {
  "seed": "ts-node prisma/seed.ts"
}

Chạy lệnh sau để khởi tạo dữ liệu mẫu:

Copy
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:

Copy
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 Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào