Performance: Why guards control access
Guards affect the speed of request handling by controlling access before route handlers run, impacting server response time and user experience.
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; @Injectable() export class FastGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { // Simple, fast check const request = context.switchToHttp().getRequest(); return Boolean(request.headers['authorization']); } }
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; @Injectable() export class SlowGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { // Simulate heavy synchronous processing for (let i = 0; i < 1e8; i++) {} return true; } }
| Pattern | CPU Usage | Event Loop Blocking | Response Delay | Verdict |
|---|---|---|---|---|
| Heavy synchronous guard logic | High | Yes, blocks event loop | High delay | [X] Bad |
| Lightweight guard with simple checks | Low | No | Minimal delay | [OK] Good |
canActivate(context: ExecutionContext) {
const request = context.switchToHttp().getRequest();
return request.user && request.user.isAdmin;
}isAdmin tries to access the guarded route?request.user exists and request.user.isAdmin is truthy.isAdminisAdmin is false or missing, the condition returns false, denying access.isAdmin is false or missing -> Option DcanActivate(context: ExecutionContext) {
const request = context.getRequest();
if (!request.user) {
throw new Error('User not found');
}
return true;
}context.getRequest() is invalid, the main issue is guard behavior on failure.request.user exists and request.user.role === 'admin' || request.user.role === 'moderator' uses OR (||) correctly. Return true if request.user exists and request.user.role === 'admin' && request.user.role === 'moderator' uses AND (&&) which is impossible for one role. Return true if request.user exists and request.user.role !== 'admin' || request.user.role !== 'moderator' uses negations incorrectly. Return true if request.user does not exist allows access without user.request.user exists and request.user.role === 'admin' || request.user.role === 'moderator' -> Option CPass the test and this pattern moves unknown