Concept Flow - Protected routes with guards
Request to route
Guard checks condition
Allow
Route handler executes
When a request comes in, the guard checks if access is allowed. If yes, the route runs. If no, access is denied.
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; @Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); return !!request.user; } }
| Step | Action | Request.user | Guard Result | Route Execution |
|---|---|---|---|---|
| 1 | Request arrives at protected route | undefined | Check if user exists | No |
| 2 | Guard runs canActivate() | undefined | false | Blocked, 403 returned |
| 3 | Request arrives at protected route | { id: 1, name: 'Alice' } | Check if user exists | Yes |
| 4 | Guard runs canActivate() | { id: 1, name: 'Alice' } | true | Route handler runs |
| Variable | Start | After Step 1 | After Step 3 | Final |
|---|---|---|---|---|
| request.user | undefined | undefined | { id: 1, name: 'Alice' } | { id: 1, name: 'Alice' } |
| guard.canActivate result | N/A | false | true | true |
Protected routes use guards to check access. Guard's canActivate returns true or false. If true, route runs; if false, access denied (403). Common check: request.user exists. Guards run before route handlers.
@UseGuards().import { CanActivate, ExecutionContext } from '@nestjs/common';
export class AlwaysDenyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
return false;
}
}Applied to a route, what is the result?
import { CanActivate, ExecutionContext } from '@nestjs/common';
export class MyGuard implements CanActivate {
canActivate(context: ExecutionContext) {
if (context.switchToHttp().getRequest().user) {
return true;
}
}
}import { CanActivate, ExecutionContext } from '@nestjs/common';
export class RolesGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const user = request.user;
// Which condition correctly checks for admin role?
}
}role, not an array.user.role === 'admin'. return user && user.roles.includes('admin'); assumes roles is an array, which may be incorrect. Options C and D misuse property types.Pass the test and this pattern moves unknown