NestJS에서 배열 구문 분석 및 유효성 검사, DTO 검증
TypeScript는 제네릭 또는 인터페이스에 대한 메타데이터를 저장하지 않으므로 DTO에서 사용할 때 ValidationPipe들어오는 데이터의 유효성을 제대로 검사하지 못할 수 있다.
0-1). 아래와 같은 CreateUserDto가 있다고 하자.
0-2). 예를 들어 아래 Body에 CreateUserDto의 속성들을 빈값으로 넣어준다.
1-1) 다음 코드에서는 0-2)같은 createUserDto배열의 내용들이 올바르게 유효성이 검사되지 않는다.
@Post()
@ApiBody({ type: [CreateUserDto] })
@ApiOperation({
summary: `새로운 User 추가`,
})
@ApiCreatedResponse({
type: [CreateUserDto],
})
async createUsers(
@Body() usersDto: CreateUserDto[],
) {
return this.userService.create(usersDto);
}
1-2). 아래와 같이 Swagger에서 DTO검증이 제대로 되지 않고 성공하는 모습을 볼 수 있다.
2-1) 배열의 유효성을 검사하려면
- 배열을 래핑하는 속성이 포함된 전용 클래스를 만들어야한다.
- ParseArrayPipe를 사용해야 한다.
다음 코드에서는 0-2)같은 createUserDto배열의 내용들이 올바르게 유효성이 검사된다.
@Post()
@ApiBody({ type: [CreateUserDto] })
@ApiOperation({
summary: `새로운 User 추가`,
})
@ApiCreatedResponse({
type: [CreateUserDto],
})
async createUsers(
@Body(new ParseArrayPipe({ items: CreateUserDto }))
usersDto: CreateUserDto[],
) {
return this.userService.create(usersDto);
}
2-2) 아래와 같이 Swagger에서 DTO검증이 제대로 되어 400Error가 발생한 모습을 볼 수 있다.
* 쿼리 매개변수를 구문 분석할 때 ParseArrayPipe가 유용할 수 있다.
쿼리 매개변수로 전달된 식별자를 기반으로 사용자를 반환하는 findByIds() 메서드가 있다고 해보자.
@Get()
findByIds(
@Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
ids: number[],
) {
return 'This action returns users by ids';
}
이 구조는 다음과 같이 HTTP GET 요청에서 들어오는 쿼리 매개변수의 유효성을 검사한다.
GET /?ids=1,2,3
'개발 프레임워크 > NestJS' 카테고리의 다른 글
[NestJS] @ValidationNested로 하위 연관 dto 검증하기 (0) | 2023.03.04 |
---|---|
[Mongoose] Model.events, Model관련 Error 처리 (0) | 2023.03.01 |
[NestJS] 매핑유형(Partial, Pick, Omit, Intersection) Type() (0) | 2023.02.23 |
[NestJS] MongoDB 컬렉션에 문서(객체)를 삽입하기 (0) | 2023.02.21 |
[NestJS] 데이터 추출(페이지네이션), skip(), hasNext(), next() (0) | 2023.02.20 |
댓글