요청으로 받는 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가 먼저 실행되기 때문에 만든 파이프까지 가기 전에 실패해 버린다.
'Backend > Error' 카테고리의 다른 글
[Docker] 도커 포트 에러 (0) | 2023.02.14 |
---|