NestJS Cơ bản
NestJS có nhiều decorator, nên rất dễ viết đúng cú pháp mà vẫn hiểu sai thời điểm mọi thứ xảy ra. Hai câu hỏi hay bị trộn: ứng dụng được lắp ghép lúc nào, và một request đi qua những gì. Tách hai câu này ra là cách nhanh nhất để đọc lỗi của Nest.
Hai thời điểm khác nhau
Phần tiêu đề “Hai thời điểm khác nhau”| Thời điểm | Chuyện xảy ra | Đọc |
|---|---|---|
| Bootstrap | Nest đọc metadata module, dựng graph, tạo provider. Module chỉ là khai báo, không chạy lại theo request | Module, provider, controller, DI container |
| Có request | Request đi qua middleware, guard, interceptor, pipe tới handler, rồi quay ra qua interceptor; lỗi rẽ sang filter | Request lifecycle |
Lỗi khó chịu nhất nằm ở giao điểm: đặt state của một request vào field của provider mặc định (dùng chung cho mọi request), hoặc gắn request scope lên provider trung tâm khiến cả cây bị tạo lại mỗi request (provider scopes).
Lộ trình đọc
Phần tiêu đề “Lộ trình đọc”| Thứ tự | Bài | Mức | Trả lời |
|---|---|---|---|
| 1 | Module, provider và controller | Cơ bản | Ba vai trò, import/export, đọc lỗi “can’t resolve dependencies” |
| 2 | DI container | Trung cấp | Token, useClass vs useExisting, @Optional, async provider, dynamic module |
| 3 | Provider scopes | Trung cấp | Bao nhiêu instance, vì sao request scope lan lên, REQUEST hay ALS |
| 4 | Request lifecycle | Trung cấp | Thứ tự các lớp, ba đường đi, filter bắt lỗi nào |
| 5 | Custom decorator & Reflector | Trung cấp | @Public(), @Roles(), override hay merge metadata |
| 6 | Dynamic module | Trung cấp | forRoot/forRootAsync, vì sao import hai lần thành hai instance |
| 7 | Validation DTO | Cơ bản | whitelist, nested DTO, query param, mass assignment |
| 8 | Exception filter & error response | Trung cấp | Một format lỗi, map 23505 thành 409, lỗi không tới filter |
| 9 | Transaction xuyên service (CLS) | Nâng cao | Giữ một connection qua nhiều service, propagation, bẫy quên await |
Chọn bài theo tình huống
Phần tiêu đề “Chọn bài theo tình huống”| Tình huống | Đọc |
|---|---|
| Mới bắt đầu với NestJS | Bài 1, rồi bài 4 |
UnknownDependenciesException lúc khởi động |
Module, provider và controller, phần import/export |
| Cần hai token trỏ về cùng một instance | DI container, phần useExisting |
| Không rõ đặt logic ở guard, interceptor hay pipe | Request lifecycle |
Hai request ghi đè currentTenant của nhau |
Provider scopes, rồi AsyncLocalStorage |
@Public() trên controller không có tác dụng |
Custom decorator & Reflector |
Client gửi role: "admin" mà vẫn lọt |
Validation DTO |
| Mỗi lỗi một format, lỗi DB thành 500 | Exception filter & error response |
| Lỗi giữa chừng để lại dữ liệu nửa vời giữa các service | Transaction xuyên service (CLS) |
| Nghi handler làm chậm request khác | Chưa có bài NestJS riêng; xem Event loop Node.js |
Nhóm này hiện có chín bài trên. Chưa có bài về testing, microservices hay GraphQL trong NestJS.