Javascript/NestJS

커스텀파이프로 데이터 바인딩 및 유효성 검사

kyoulho 2023. 3. 13. 20:30

요청 유효성 검사


 

UserUpdateDto

export class UserUpdateDto {
  @IsNotIn([' '])
  @Length(1, 7)
  nickname: string;

  @MaxDate(new Date())
  birthdate: Date;
}

@IsNotIn()는 리스트를 파라미터로 받아 리스트 안에 객체와 같으면 BadRequest를 응답한다.

 

ParseUserUpdateDtoPipe

요청으로 넘어오는 birthdate는 String이다. 때문에 Date 타입으로 변경해야 한다. CustomException은 HttpException을 상속한 커스텀 예외이다.

export class ParseUserUpdateDtoPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata): UserUpdateDto {
    if (metadata.metatype !== UserUpdateDto) return value;
    const { nickname, birthdate } = value;
    try {
      const date = new Date(Number(birthdate));
      return { nickname, birthdate: date };
    } catch (error) {
      throw new CustomException(
        ExceptionCode.INVALID_DATE,
        error.message,
        HttpStatus.BAD_REQUEST,
      );
    }
  }
}

 

UserController

ParseUserUpdateDtoPipe를 먼저 넣어줘야 Request를 UserUpdateDto로 변환 후 유효성 검사를 진행한다.

@Patch()
async modifyUser(
  @GetUserId() userId: number,
  @Body(ParseUserUpdateDtoPipe, ValidationPipe) userUpdateDto: UserUpdateDto,
) {
    await this.userService.updateUser(userId, userUpdateDto);
}

 

 

결과

{
    "statusCode": 400,
    "message": [
        "nickname should not be one of the following values:  "
    ],
    "error": "Bad Request"
}

해결!!!! 원하는 응답이 왔습니다.

이렇게 삽질을 하고부터는 모든 컨트롤러 메소드에 Pipe와 변수명을 꼭 사용하고 있습니다. 하지만 계속 찜찜함이 남습니다. 애플리케이션이 커지면 모든 Dto를 검사할 때마다 Pipe를 만들어야 할 테니깐요.

728x90

'Javascript > NestJS' 카테고리의 다른 글

NestJS Provider, Service에 대해 알아보기  (0) 2023.03.22
NestJS Pipe에 대해 알아보기  (0) 2023.03.14
NestJS Controller에 대해 알아보기  (0) 2023.03.13
NestJS Module에 대해 알아보기  (0) 2023.03.13
프로젝트 구조  (0) 2023.03.13