[NestJS] Execution Context & Reflection: Linh Hồn Của Middleware
Một trong những điểm ăn tiền nhất của NestJS là khả năng chạy trên nhiều môi trường khác nhau: HTTP Server (Express/Fastify), WebSockets, Microservices (RPC), và cả GraphQL.
Nhưng điều này tạo ra một bài toán khó: Nếu bạn viết một AuthGuard để kiểm tra quyền đăng nhập, làm sao Guard đó biết cách lấy token từ Request HTTP, hay lấy từ Context của GraphQL? Lời giải chính là ArgumentsHost và ExecutionContext.
Agenda
Thời gian đọc ước tính: ~14 phút
Learning outcome:
- Hiểu được tại sao NestJS phải trừu tượng hóa các tham số đầu vào thay vì truyền trực tiếp đối tượng
Request/Responsecủa Express. - Phân biệt được vai trò của
ArgumentsHost(bọc tham số) vàExecutionContext(chứa thông tin class/handler). - Thao tác chuyển đổi ngữ cảnh an toàn bằng các hàm
switchToHttp(),switchToRpc(). - Làm chủ cơ chế Reflection: Tự tạo Custom Decorator và đọc Metadata từ Guard/Interceptor bằng class
Reflector.
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| ArgumentsHost | Máy chủ chứa tham số. Một class đóng vai trò làm lớp trừu tượng (abstraction), bọc lại tất cả các tham số gốc truyền vào handler (Ví dụ: [req, res, next] của Express). |
| ExecutionContext | Ngữ cảnh thực thi. Kế thừa từ ArgumentsHost, cung cấp thêm thông tin về việc Request hiện tại đang chuẩn bị gọi vào Controller nào và Hàm (Handler) nào. |
| Reflector | Bộ phản xạ. Một class tiện ích của NestJS dùng để đọc Metadata (D ữ liệu đặc tả) đã được gắn lên Class hoặc Handler thông qua Decorator. |
| Metadata | Dữ liệu đặc tả. Những thông tin bổ sung gắn kèm với code (Ví dụ: Đánh dấu hàm này cần quyền 'admin'). |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context (Nghĩa trong ngữ cảnh) |
|---|---|
| Abstraction (n) | Sự trừu tượng hóa. Che giấu sự phức tạp của nền tảng bên dưới (Express, Fastify) để cung cấp một API chung nhất. |
| Pluck (v) | Nhổ, rút ra. (Ví dụ: Rút một tham số cụ thể ra khỏi mảng bằng chỉ mục index). |
| Selectively (adv) | Một cách có chọn lọc. (Ví dụ: Ghi đè cấu hình một cách có chọn lọc cho từng hàm). |
1. WHY — Tại sao không dùng trực tiếp req và res?
Nếu bạn đã từng code Express.js, bạn viết Middleware thế này:
function authMiddleware(req, res, next) {
const token = req.headers.authorization;
// ...
}
Nhưng trong NestJS, bạn có thể tạo ra một Guard và gắn nó cho cả REST API lẫn GraphQL.