What is the purpose of the Reflector class in NestJS?
Reflector helps read metadata set by decorators on classes, methods, or properties. It allows you to access custom data attached to these elements at runtime.
Click to reveal answer
beginner
How do you create a custom decorator in NestJS?
You create a custom decorator by defining a function that uses the SetMetadata() helper to attach metadata to a target, like a class or method.
Click to reveal answer
intermediate
Explain how custom decorators and Reflector work together in NestJS.
Custom decorators add metadata to classes or methods. Reflector reads this metadata during runtime, often inside guards or interceptors, to change behavior based on that metadata.
Click to reveal answer
intermediate
What is the syntax to read metadata using Reflector inside a guard?
Use `const value = this.reflector.get('key', context.getHandler())` to get metadata with key 'key' from the current method handler.
Click to reveal answer
intermediate
Why use custom decorators instead of hardcoding values in guards or controllers?
Custom decorators keep code clean and reusable by separating metadata from logic. They make it easy to add or change behavior without modifying guard or controller code directly.
Click to reveal answer
What does the Reflector class in NestJS primarily do?
AManages dependency injection
BReads metadata set by decorators
CHandles database connections
DCreates HTTP routes
✗ Incorrect
Reflector reads metadata attached by decorators on classes or methods.
Which helper function is commonly used to create custom decorators in NestJS?
ASetMetadata()
B@Injectable()
C@Controller()
D@UseGuards()
✗ Incorrect
SetMetadata() attaches custom metadata to classes or methods.
Where do you usually use Reflector to read metadata?
AIn database entities
BIn service constructors
CInside guards or interceptors
DIn middleware only
✗ Incorrect
Guards and interceptors often read metadata to decide behavior.
What argument does Reflector.get() require to read method metadata?
AThe HTTP request object
BThe method name as string
CThe class instance
DThe metadata key and the method handler
✗ Incorrect
Reflector.get() needs the metadata key and the method handler (context.getHandler()).
Why is using custom decorators beneficial in NestJS?
AThey improve code readability and reuse
BThey speed up database queries
CThey replace controllers
DThey handle HTTP responses
✗ Incorrect
Custom decorators keep code clean and reusable by separating metadata from logic.
Describe how to create and use a custom decorator with Reflector in NestJS.
Think about how metadata flows from decorator to runtime reading.
You got /5 concepts.
Explain why Reflector and custom decorators improve code organization in NestJS applications.
Consider how metadata helps keep code clean and flexible.
You got /5 concepts.
Practice
(1/5)
1. What is the primary purpose of the Reflector class in NestJS when used with custom decorators?
easy
A. To read metadata set by custom decorators on classes or methods
B. To create new decorators dynamically at runtime
C. To replace the default routing mechanism in controllers
D. To automatically validate request payloads
Solution
Step 1: Understand Reflector's role
The Reflector class is designed to read metadata that custom decorators attach to classes or methods.
Step 2: Differentiate from other functions
It does not create decorators, change routing, or validate payloads; it only reads metadata.
Final Answer:
To read metadata set by custom decorators on classes or methods -> Option A
Quick Check:
Reflector reads metadata = D [OK]
Hint: Reflector always reads metadata, never creates or changes routes [OK]
Common Mistakes:
Thinking Reflector creates decorators
Confusing Reflector with validation tools
Assuming Reflector changes routing behavior
2. Which of the following is the correct way to define a custom decorator that sets metadata with key 'roles' and value passed as argument?
easy
A. export function Roles() { return SetMetadata('roles'); }
B. export function Roles(roles: string[]) { return Reflect.metadata('roles', roles); }
C. export const Roles = (roles: string[]) => Reflector.set('roles', roles);
D. export const Roles = (roles: string[]) => SetMetadata('roles', roles);
Solution
Step 1: Recall SetMetadata usage
SetMetadata is the NestJS helper to create decorators that attach metadata with a key and value.
Step 2: Check each option
export const Roles = (roles: string[]) => SetMetadata('roles', roles); correctly returns SetMetadata with key 'roles' and the passed roles array. export function Roles(roles: string[]) { return Reflect.metadata('roles', roles); } uses Reflect.metadata which is not standard in NestJS. export const Roles = (roles: string[]) => Reflector.set('roles', roles); incorrectly calls Reflector.set which does not exist. export function Roles() { return SetMetadata('roles'); } calls SetMetadata without value, which is invalid.
SetMetadata creates decorators with key-value metadata = A [OK]
Hint: Use SetMetadata(key, value) to create custom decorators [OK]
Common Mistakes:
Using Reflector to set metadata instead of reading
Omitting the value argument in SetMetadata
Using Reflect.metadata instead of SetMetadata
3. Given this code snippet, what will be logged when accessing the getData method?
import { Controller, Get, UseGuards, SetMetadata } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
const Roles = (roles: string[]) => SetMetadata('roles', roles);
@Controller('items')
export class ItemsController {
@Get()
@Roles(['admin'])
getData() {
return 'secret data';
}
}
// In a guard:
const reflector = new Reflector();
const roles = reflector.get<string[]>('roles', ItemsController.prototype.getData);
console.log(roles);
medium
A. ['admin']
B. undefined
C. An error because metadata key is missing
D. [] (empty array)
Solution
Step 1: Understand metadata retrieval context
Reflector.get requires the target object and the property key (method name as string) to read metadata.
Step 2: Analyze the call
The code calls reflector.get with ItemsController.prototype.getData as the second argument, which is a function, not the method name string 'getData'. This causes Reflector to fail to find metadata and return undefined.
Final Answer:
undefined -> Option B
Quick Check:
Reflector.get needs method name string, else returns undefined [OK]
Hint: Pass method name as string to Reflector.get to read metadata [OK]
Common Mistakes:
Passing method function instead of method name string
Expecting metadata on class prototype instead of method
Assuming metadata always returns array
4. Identify the error in this custom decorator usage and how to fix it:
A. The decorator must be applied to the class, not method
B. The decorator is missing the return type annotation
C. The decorator should use SetMetadata instead of Reflect.defineMetadata
D. The decorator function parameters are incorrect; should include descriptor
Solution
Step 1: Check decorator implementation
The decorator manually calls Reflect.defineMetadata, which works but is not recommended in NestJS.
Step 2: Use NestJS helper for consistency
SetMetadata is the standard NestJS helper that wraps Reflect.defineMetadata and ensures compatibility with Reflector and other NestJS internals.
Final Answer:
The decorator should use SetMetadata instead of Reflect.defineMetadata -> Option C
Quick Check:
Use SetMetadata for custom decorators in NestJS [OK]
Hint: Always use SetMetadata helper for custom decorators [OK]
Common Mistakes:
Using Reflect.defineMetadata directly instead of SetMetadata
Ignoring NestJS decorator conventions
Misunderstanding decorator parameters
5. You want to create a guard that allows access only if the user has at least one role from the @Roles decorator metadata. Which approach correctly uses Reflector and the custom decorator to achieve this?
hard
A. Use Reflector.getAllAndOverride('roles', [context.getHandler(), context.getClass()]) to get roles, then check user roles against it
B. Use Reflector.get('roles', context.getHandler()) only, ignoring class-level metadata
C. Manually parse request headers for roles instead of using Reflector
D. Use Reflector.set('roles', roles) inside the guard to assign roles dynamically
Solution
Step 1: Understand metadata inheritance
Roles can be set on method or class level. To get effective roles, use Reflector.getAllAndOverride which checks method first, then class.
Step 2: Implement guard logic
Retrieve roles with getAllAndOverride, then compare with user's roles to allow or deny access.
Final Answer:
Use Reflector.getAllAndOverride('roles', [context.getHandler(), context.getClass()]) to get roles, then check user roles against it -> Option A
Quick Check:
getAllAndOverride merges metadata from method and class [OK]
Hint: Use getAllAndOverride to combine method and class metadata [OK]
Common Mistakes:
Ignoring class-level metadata roles
Trying to set metadata inside guard
Not using Reflector to read metadata
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.