관리 메뉴

Mini

[Nest] 커스텀 데코리이터 => controller 코드 간소화 본문

JS/Nest.js

[Nest] 커스텀 데코리이터 => controller 코드 간소화

Mini_96 2024. 9. 20. 17:14
  • data는 컨트롤러에서 넣어준 인자를 뜻한다.
  • 이걸로 원하는 속성만 return 해줄수있다.
import { createParamDecorator, ExecutionContext, InternalServerErrorException } from "@nestjs/common";
import { UsersModel } from "../entities/users.entity";

/**
 * accessTokenGuard에서 req에 넣어준 user를 검사하고
 * 리턴해주는 데코레이터
 * @param : usersModel의 key
 */
export const User = createParamDecorator((data: keyof UsersModel | undefined, context : ExecutionContext) => {
  const req = context.switchToHttp().getRequest();

  const user = req.user;

  /**
   * AccessTokenGuard 사용후 (req.user에 주입후)
   * 이걸 사용해야 user가 있음.
   * 이게 비어있다 ? -> 서버에러임 -> AccessTokenGuard를 추가하면됨
   */
  if (!user) {
    throw new InternalServerErrorException('' +
      'User 데코레이저는 AccessGuard와 함께 사용해야합나다. ' +
      'Request에 user 프로퍼티가 존재하지 않습니다!')
  }

  /**
   * @User('id')와 같이 특정 속성만 달라고 요청한경우
   */
  if(data){
    return user[data];
  }

  return user;
});
  • 컨트롤러
@Post()
@UseGuards(AccessTokenGuard)
createPost(
  @User('id') userId : number,
  @Body('title') title: string,
  @Body('content') content:string, ){
  return this.postsService.createPost(userId , title, content);
}

결과