[NestJS 공식문서 정독하기] Overview - Custom decorators

2022. 8. 6. 19:46Web/NestJS

반응형
🔗  https://docs.nestjs.com/custom-decorators
 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

Custom route decorators

  • NestJS는 decorator라는 기능으로 구성되어 있임
  • decorator는 여러 언어에서 익숙한 개념이지만 Javascript에서는 비교적 새로운 개념임
  • decorator를 더 이해하고 싶다면 링크를 참조

Param decorators

  • NestJS는 HTTP route handler와 함께 사용할 수 있는 param decorator를 제공함
  • param decorator 목록
import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);
@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}
  • custom decorator도 생성할 수 있음
  • node.js에서는 요청 객체에 프로퍼티를 추가하고 route handler에서 추출해 사용하는 방식이 흔히 사용됨
  • 위와 같이 @User() decorator를 만들어서 필요한 곳에 사용할 수 있음

Passing data

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const user = request.user;

    return data ? user?.[data] : user;
  },
);
@Get()
async findOne(@User('firstName') firstName: string) {
  console.log(`Hello ${firstName}`);
}
  • custom decorator를 특정 조건에 따라 다른 처리하도록 하기 위해 data 매개 변수를 활용할 수 있음
  • 해당 매개 변수의 한 가지 사용 사례가 있다면, 요청 객체의 특정 데이터를 키값으로 추출하는 것임
  • 위와 같이 @User('firstName') decorator로 request.user.firstName 을 추출할 수 있음
  • 해당 decorator를 사용해 requset.user 의 다양한 다른 데이터를 키값으로 추출 할 수 있음
  • typescript 환경에서는 createParamDecorator<T>() 는 generic이기 때문에 data 매개 변수의 타입을 강제할 수 있음

Working with pipes

@Get()
async findOne(
  @User(new ValidationPipe({ validateCustomDecorators: true }))
  user: UserEntity,
) {
  console.log(user);
}
  • NestJS는 custom decorator를 내장 decorator들과 같은 방식으로 처리하기 때문에 모두 pipe가 적용 가능함
  • 다만, custom decorator는 pipe를 적용하기 위해서는 validateCustomDecorators 옵션이 true이어야 함

Decorator composition

import { applyDecorators } from '@nestjs/common';

export function Auth(...roles: Role[]) {
  return applyDecorators(
    SetMetadata('roles', roles),
    UseGuards(AuthGuard, RolesGuard),
    ApiBearerAuth(),
    ApiUnauthorizedResponse({ description: 'Unauthorized' }),
  );
}
@Get('users')
@Auth('admin')
findAllUsers() {}
  • NestJS는 여러가지 decorator들 하나의 decorator로 합성하기 위한 helper method를 제공함
반응형