NestJS là một framework cực kỳ mạnh mẽ để xây dựng ứng dụng backend với Node.js, đặc biệt theo hướng modular & scalable (có cấu trúc mô-đun, dễ mở rộng). Để hiểu sâu kiến trúc của NestJS, mình sẽ chia thành các phần chính:

  1. Tư tưởng cốt lõi

NestJS lấy cảm hứng từ Angular, một framework khác của Javascript đến từ nhà Google cho phía client, sử dụng các khái niệm như:

  • Module

  • Controller

  • Service

  • Dependency Injection

  • Decorator

Với kiến trúc này giúp chúng ta viết mã có cấu trúc, tách biệt rõ trách nhiệm, và dễ kiểm thử.

      2. Thành phần kiến trúc chính.

  Module

  • Là đơn vị tổ chức cao nhất.

  • Một ứng dụng NestJS là tập hợp của nhiều module. Mỗi module chịu trách nghiệm xử lý một logic nghiệp vụ nào đó.

  • Ví dụ: UsersModule, AuthModule, ProductsModule

Controller

  • Chịu trách nhiệm xử lý và điều hướng request HTTP (GET, POST…).

  • Gọi tới Service để thực thi logic.

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

Service

  • Chứa logic xử lý chính (business logic).

  • Được inject vào controller

@Injectable()
export class UsersService {
  findAll() {
    return ['User 1', 'User 2'];
  }
}

Dependency Injection (DI)

  • NestJS có DI Container tích hợp sẵn.

  • Bạn chỉ cần @Injectable() và dùng constructor là tự động inject được

Provider

  • Là bất kỳ class nào có thể được inject vào nơi khác.

  • Service là một provider, nhưng bạn có thể định nghĩa thêm như: LoggerProvider, ConfigProvider, MailProvider

      3. Kiến trúc thư mục (dựa vào kinh nghiệm của tôi)

src/
  ├── app.module.ts        <-- Module gốc
  ├── main.ts              <-- Entry point
  ├── users/
  │   ├── users.module.ts
  │   ├── users.controller.ts
  │   └── users.service.ts
  ├── auth/
  │   ├── auth.module.ts
  │   ├── auth.controller.ts
  │   └── auth.service.ts

      4. Một số khái niệm nâng cao

Middleware

  • Chạy trước controller, có thể dùng để log, check auth…

@Injectable()
export class LoggerMiddleware {
  use(req: Request, res: Response, next: Function) {
    console.log('Request...');
    next();
  }
}

Guard

  • Bảo vệ route, dùng để kiểm tra phân quyền, token…

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    // logic check quyền
  }
}

Interceptor

  • Dùng để xử lý trước/sau khi controller trả kết quả. Giống như AOP.

Pipe

  • Dùng để validate, transform dữ liệu đầu vào (DTO).

Custom Decorator

  • Tự định nghĩa decorator như @CurrentUser()

Bài viết này mình giới thiệu sơ qua về kiến trúc cũng như các khái niệm mà rất hay sử dụng khi làm việc với NestJs, các bài tiếp theo chúng ta sẽ cùng đi sâu hơn các khái niệm trên, hẹn gặp lại các bạn ở bài viết tiếp theo.

 

Dong Nguyen

Try to work the best.