Junior #middleware#guard#authorization
Middleware và Guard trong NestJS khác nhau thế nào? Khi nào dùng cái nào?
⚡ Trả lời nhanh
Middleware chạy sớm nhất, chỉ biết req/res/next, không biết handler nào sẽ chạy; hợp cho logging, CORS, parse. Guard chạy sau middleware, có ExecutionContext nên biết controller/handler và metadata (Reflector); hợp cho authentication/authorization và trả boolean cho phép hay chặn.
| Middleware | Guard | |
|---|---|---|
| Thứ tự | Trước guard | Sau middleware, trước interceptor/pipe |
| Truy cập | req, res, next | ExecutionContext (class, handler, args) |
| Biết route handler? | Không | Có, đọc được metadata qua Reflector |
| Dùng cho | Log, request id, cookie parser | Auth, RBAC, feature flag |
| Kết quả | Gọi next() hoặc kết thúc response | Trả true/false, hoặc ném exception |
| Hỗ trợ DI | Có (class middleware) | Có |
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(ctx: ExecutionContext): boolean {
const req = ctx.switchToHttp().getRequest();
return !!req.headers.authorization; // false thì Nest trả 403
}
}
@UseGuards(AuthGuard)
@Get('me') me() {}