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을 인지하기 때문에 유효성 검사에 실패한 것이다.
파이프에 대한 내부 동작 과정은 지난 기록에서 다뤘다.
그리고 stackoverflow에 위의 문제에 대한 자세한 설명이 있다.
해결
//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 |
---|