NestJS là framework Node.js TypeScript-first lấy cảm hứng từ Angular, tổ chức code theo Modules, Controllers và Providers (thường là Services) với Dependency Injection tích hợp sẵn. Nó không thay thế Express/Fastify mà chạy trên một trong hai adapter đó và thêm lớp abstraction để chuẩn hoá cấu trúc dự án.
NestJS hoạt động nhờ decorators (@Module(), @Controller(), @Injectable()) kết hợp reflect-metadata để lưu metadata về dependency tại compile-time. Khi khởi động, IoC container đọc metadata, xây dựng dependency graph theo module và khởi tạo provider theo scope (mặc định singleton). Request đi qua pipeline cố định: middleware -> guard -> interceptor (pre) -> pipe -> handler trong controller -> service -> interceptor (post) -> exception filter. Nhờ pipeline này, bạn tách rõ cross-cutting concern như validation, auth, logging khỏi business logic, và có thể thay thế provider bằng mock khi test mà không cần monkey-patching như với Express thuần.
So với Express thuần, Express cho bạn router và middleware tối giản, linh hoạt nhưng không quy định cấu trúc thư mục, cách tổ chức validation hay DI. NestJS áp đặt quy ước, hỗ trợ sẵn validation với ValidationPipe + class-validator, serialization, GraphQL, WebSockets, microservices (gRPC, Redis, Kafka) và OpenAPI generation, nên phù hợp khi team lớn hoặc codebase cần duy trì lâu dài.
- Lỗi thường gặp: tạo quá nhiều module cho CRUD đơn giản gây phức tạp không cần thiết; dùng provider scope
REQUESTtràn lan làm mất lợi ích singleton và tăng memory; circular dependency giữa hai service khi chưa tách shared module; nghĩ abstraction che hết Express nên không xử lý trực tiếp response/stream khi cần hiệu năng.
Lưu ý: Chọn NestJS khi bạn cần quy ước, khả năng test và mở rộng cho dự án trung bình đến lớn. Giữ Express thuần khi service rất nhỏ, cần kiểm soát tối đa overhead hoặc prototype nhanh mà chưa cần cấu trúc nặng.