본문 바로가기

Backend/Error

[NestJS] NestJS param 유효성 검사

728x90
요청으로 받는 param을 dto를 통해 유효성 검사하기

문제상황

 @Get('questions/:part')
  findQuestions(
    @Param('part')
    part: Part,
  ) {
    return this.assetsService.findQuestions(part);
  }

ValidationPipe가 글로벌로 지정되어 있는 상황이고,

part를 Part DTO를 통해 유효성 검사로 특정값만을 받고 싶었다.

 

ValidationPipe는 받은 param에 대해 dto를 통해 유효성 검사를 하게 된다.

이 과정에서 plainToClass로 param 객체를 DTO class 인스턴스화해서 유효성 검사를 하는데

 

위 코드처럼 param을 받을 경우,

{part:value} 형태가 아닌 value로 param을 인지하기 때문에 유효성 검사에 실패한 것이다.

 

파이프에 대한 내부 동작 과정은 지난 기록에서 다뤘다.

 

[NestJS] User API 만들기(3) (파이프 Pipe 유효성 검사)

NestJS 파이프에 대한 공부 기록이다. 개요 파이프는 요청이 라우터 핸들러로 전달되기 전 요청 객체를 변환할 수 있는 기회를 제공한다. 파이프는 일반적으로 아래 두 가지의 목적으로 사용한다.

choi-records.tistory.com

그리고 stackoverflow에 위의 문제에 대한 자세한 설명이 있다.

 

Is it possible to validate single route parameter?

Let's say I have following route: companies/{companyId}/departments/{departmentId}/employees Is it possible to validate both resources ids (companyId, departmentId) separately? I've tried followi...

stackoverflow.com

해결

  //Controller
  @Get('questions/:part')
  findQuestions(
    @Param()
    param: Part,
  ) {
    return this.assetsService.findQuestions(param.part);
  }
//DTO
import { IsIn, IsString } from 'class-validator';

type Parts = 'web' | 'server' | 'design';

export class Part {
  @IsString()
  @IsIn(['web', 'server', 'design'])
  part: Parts;
}

위와 같이 해결했다.

stackoverflow에 나온 예시처럼 커스텀 파이프를 만들면,

글로벌로 설정한 ValidationPipe가 먼저 실행되기 때문에 만든 파이프까지 가기 전에 실패해 버린다.

 

 

728x90

'Backend > Error' 카테고리의 다른 글

[Docker] 도커 포트 에러  (0) 2023.02.14