Reflector

Reads custom metadata attached by decorators, typically inside guards and interceptors.

Since NestJS 10/11 Spec ↗

Syntax

reflector.getAllAndOverride(key, [handler, class])

Parameters

NameTypeRequiredDescription
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.