export class CardPostsDto {
@IsNotEmpty()
maincategory: string;
@IsNotEmpty()
category: string;
@IsNotEmpty()
@IsNumber()
splitNumber: number;
@IsNotEmpty()
@IsNumber()
splitPageNumber: number;
}
export class CardPostsPageNation extends PickType(CardPostsDto, [
'category',
'maincategory',
]) {}
export class UpdateCatAgeDto extends PickType(CardPostsDto, [
'splitPageNumber',
]) {}
@Post('test')
@UsePipes(ValidationPipe)
async testPageNation(
@Query()
cardPostsPageNation: CardPostsPageNation,
@Body()
updateCatAgeDto: UpdateCatAgeDto,
) {
// return 값은 Dto로 지정한 프로퍼티만 가져오기를 기대함
return { updateCatAgeDto, cardPostsPageNation };
}
// 실행 결과
{
"updateCatAgeDto": {
"maincategory": "maincategory111",
"category": "sgsdgsd",
"splitNumber": "11", // 의도하지 않은 값
"splitPageNumber": 11, // 의도하지 않은 값
"badprop": "11" // 의도하지 않은 값
},
"cardPostsPageNation": {
"maincategory": "유머", // 의도하지 않은 값
"category": "스포츠", // 의도하지 않은 값
"splitNumber": "3", // 의도하지 않은 값
"splitPageNumber": "2",
"badquery": "242" // 의도하지 않은 값
}
}
문제의 파라미터를 가지고 와서 프로퍼티를 찍어보면 내가 정의한 프로퍼티 2개가 들어있었다.
의도 하지않은 값 badprop을 출력해 보려고 하니 오류가 발생한다.
배열에 직접 입력해서 create
결과에 변화가 없었다.
타입 체크는 아니지만 express에서 비슷하게 테스트 해보았다.
일반 클래스와 빈 클래스 생성
결과
지금 겪고 있는 문제와 완전히 동일해 보였다.
가설
// 테스트를 위한 설정
...
@IsNotEmpty()
maincategory: string;
@IsNotEmpty()
@IsNumber()
splitPageNumber: number;
...
// 테스트를 위해서 maincategory 프로퍼티 추가
export class UpdateCatAgeDto extends PickType(CardPostsDto, [
'maincategory',
'splitPageNumber',
]) {}
// splitPageNumber 제거 후 입력
{
"maincategory": "maincategory111",
"category": "sgsdgsd",
"splitNumber": "dgd",
"badprop" : "11"
}
// 출력
"message": [
"splitPageNumber must be a number conforming to the specified constraints",
"splitPageNumber should not be empty"
],
// splitPageNumber에 String 입력
{
"maincategory": "maincategory111",
"category": "sgsdgsd",
"splitNumber": "dgd",
"splitPageNumber": "not Num",
"badprop" : "11"
}
// 출력
"message": [
"splitPageNumber must be a number conforming to the specified constraints"
],
// @IsNumber() 제거 후 입력
{
"maincategory": 121,
"category": "sgsdgsd",
"splitNumber": "dgd",
"splitPageNumber": "sgsdg",
"badprop" : "11"
}
// 출력
"updateCatAgeDto": {
"maincategory": 121,
"category": "sgsdgsd",
"splitNumber": "dgd",
"splitPageNumber": "sgsdg",
"badprop": "11"
},
테스트 결과
@Body()
updateCatAgeDto: UpdateCatAgeDto,
) {
const { splitPageNumber } = updateCatAgeDto;
return { splitPageNumber };
그렇다면 처음으로 돌아가서 아래와 같은 문제가 발생한다.
app.useGlobalPipes(
new ValidationPipe({
transform: true,
whitelist: true, // dto에서 명시한 데이터아니면 무시
}),
);
그냥 화이트 리스트가 true가 아니어서 문제였음