Reflector
Reads custom metadata attached by decorators, typically inside guards and interceptors.
Syntax
reflector.getAllAndOverride(key, [handler, class]) Parameters
| Name | Type | Required | Description |
|---|---|---|---|
key | string | Reflector.createDecorator | No | The metadata key set via SetMetadata or a typed decorator. |
targets | any[] | No | Handler and class references from the ExecutionContext. |
Returns
any — The resolved metadata value, with handler taking precedence.
Examples
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(ctx: ExecutionContext): boolean {
const roles = this.reflector.getAllAndOverride<string[]>('roles', [
ctx.getHandler(),
ctx.getClass(),
]);
if (!roles) return true;
const { user } = ctx.switchToHttp().getRequest();
return roles.some((r) => user?.roles?.includes(r));
}
}
Notes
getAllAndOverride() lets handler-level metadata override class-level;
getAllAndMerge() combines arrays. Prefer Reflector.createDecorator() for
type-safe metadata keys in modern code.