</>
⌕
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.

MiddlewareGuard
Thứ tựTrước guardSau middleware, trước interceptor/pipe
Truy cậpreq, res, nextExecutionContext (class, handler, args)
Biết route handler?KhôngCó, đọc được metadata qua Reflector
Dùng choLog, request id, cookie parserAuth, RBAC, feature flag
Kết quảGọi next() hoặc kết thúc responseTrả true/false, hoặc ném exception
Hỗ trợ DICó (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() {}
🃏 Ôn bằng flashcard