NestJS Docs - Excution context
host
매개변수로 참조되는 ArgumentsHost
의 인스턴스 제공host
객체는 [request, response, next]
배열 캡슐화host
객체는 [root, args, context, info]
배열 캡슐화ArgumentsHost
의 getType()
메서드 사용if(host.getType() === 'http') {
// 생략
} else if (host.getType === 'rpc') {
// 생략
} else if (host.getType === 'graphql') {
// 생략
}
getArgs()
메서드 사용const [req, res, next] = host.getArgs();
// 인덱스를 이용해 특정 인수 가져오기
const req = host.getArgByIndex(0);
const ctx = host.switchToHttp();
const req = ctx.getRequest<Request>();
const res = ctx.getResponse<Response>();
// HTTP 외 애플리케이션
switchToRpc(): RpcArgumentsHost;
export interface RpcArgumentsHost {
getData<T>(): T;
getContext<T>(): T;
}
switchToWs(): WsArgumentsHost;
export interface WsArgumentsHost {
getData<T>(): T;
getClient<T>(): T;
}
ArgumentsHost
를 확장하여 현재 실행 프로세스에 대한 추가 세부 정보 제공export interface ExecutionContext extends ArgumentsHost {
// 특정 핸들러가 속한 Controller 클래스 타입 반환
getClass<T>(): Type<T>;
// 호출될 핸들러에 대한 참조 반환
getHandler(): Function;
}
// cats.controller.ts
@Post()
@Roles('admin')
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
// roles.guard.ts
const roles = this.reflector.get<string[]>('roles', context.getHandler());
Reflector#get
(메타데이터 키, 컨텍스트(데코레이터 대상))
- controller 메타데이터를 추출할 경우,
두번째 인수로 context.getClass()
전달
컨트롤러, 메서드에 모두 메타데이터가 첨부된 경우
// cats.controller.ts
@Roles('user') // 컨트롤러 수준
@Controller('cats')
export class CatsController {
@Post()
@Roles('admin') // 메서드 수준
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
}
// roles.guard.ts
// 1. 컨트롤러 역할을 기본으로 하고, 특정 메서드에 대해 선택적으로 역할 재정의하려는 경우
const roles = this.reflector.getAllAndOverride<string[]>('roles', [
context.getHandler(),
context.getClass(),
]);
//2. 두 수준 모두에 대한 메타데이터를 가져와 병합하려는 경우
const roles = this.reflector.getAllAndMerge<string[]>('roles', [
context.getHandler(),
context.getClass(),
]);