[NestJS] Middleware: Lớp Tiền Xử Lý Request (Trước Khi Đến Controller)
Agenda
Thời gian đọc ước tính: ~10 phút
Learning outcome:
- Hiểu được vai trò và giới hạn của Middleware trong NestJS — và tại sao giới hạn đó lại dẫn đến sự ra đời của Guards.
- Tự tay viết Class-based Middleware và Functional Middleware cho một use-case thực tế.
- Đăng ký Middleware đúng cách thông qua
configure()+MiddlewareConsumer, kiểm soát phạm vi theo route và HTTP method. - Phân biệt được khi nào dùng Global Middleware (
app.use()) và khi nào cần dùng scoped Middleware.
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| Middleware | Phần mềm trung gian. Hàm/class đứng giữa Request đến và Route Handler — có khả năng đọc, sửa đổi, hoặc dừng Request. |
| MiddlewareConsumer | Người tiêu thụ Middleware. Đối tượng tiện ích của NestJS dùng để cấu hình và áp dụng Middleware theo route. |
| Execution Context | Ngữ cảnh thực thi. Thông tin về Controller, Method, và loại ứng dụng đang xử lý request (HTTP, WebSocket...). |
next() function | Hàm chuyển tiếp. Gọi hàm này để chuyển quyền kiểm soát sang middleware tiếp theo hoặc Route Handler. |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context (Nghĩa trong ngữ cảnh) |
|---|---|
| Interpose (v) | Đặt vào giữa, can thiệp vào giữa hai điểm trong một quy trình. |
| Agnostic (adj) | Không phụ thuộc, độc lập. "Context-agnostic" = không biết và không quan tâm đến ngữ cảnh. |
| Chained (adj) | Nối tiếp nhau theo kiểu chain. Fluent API cho phép gọi method liên tiếp như a.b().c().d(). |
1. WHY — Middleware ra đời để giải quyết bài toán gì?
HTTP Web Applications cần thực hiện một loạt các tác vụ "tiền xử lý" cho mỗi Request trước khi chúng đến được Controller:
Các tác vụ tiền xử lý phổ biến:
- Ghi log Request: Ghi lại IP, timestamp, method, URL cho mục đích monitoring.
- Cấu hình CORS Header: Thêm các header cho phép cross-origin request.
- Parse Request Body: Chuyển đổi raw bytes thành JSON object (Express làm điều này bằng
body-parser). - Rate Limiting sơ bộ: Kiểm tra tần suất request từ một IP.
Middleware chính xác là công cụ được thiết kế cho những tác vụ này. Về bản chất, NestJS Middleware là Express Middleware — cùng cú pháp (req, res, next), cùng cơ chế chain, được tích hợp vào kiến trúc NestJS.
Giới hạn quan trọng của Middleware:
Middleware "mù tịt" (context-agnostic) về hệ thống NestJS. Nó không biết và không thể truy cập vào ExecutionContext — nghĩa là không biết Controller nào sẽ xử lý Request, không biết Method nào sẽ được gọi, không đọc được Metadata đã gắn trên Route Handler (như Roles, Permissions).
Chính giới hạn này là lý do tại sao Guards được tạo ra — để làm những việc mà Middleware không thể làm (xem lại bài 04-aop-layer/02-guards.mdx).