요청 유효성 검사
UserUpdateDto
export class UserUpdateDto {
@IsNotIn([' '])
@Length(1, 7)
nickname: string;
@MaxDate(new Date())
birthdate: Date;
}
@IsNotIn()는 리스트를 파라미터로 받아 리스트 안에 객체와 같으면 BadRequest를 응답한다.
ParseUserUpdateDtoPipe
요청으로 넘어오는 birthdate는 String이다. 때문에 Date 타입으로 변경해야 한다. CustomException은 HttpException을 상속한 커스텀 예외이다.
export class ParseUserUpdateDtoPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata): UserUpdateDto {
if (metadata.metatype !== UserUpdateDto) return value;
const { nickname, birthdate } = value;
try {
const date = new Date(Number(birthdate));
return { nickname, birthdate: date };
} catch (error) {
throw new CustomException(
ExceptionCode.INVALID_DATE,
error.message,
HttpStatus.BAD_REQUEST,
);
}
}
}
UserController
ParseUserUpdateDtoPipe를 먼저 넣어줘야 Request를 UserUpdateDto로 변환 후 유효성 검사를 진행한다.
@Patch()
async modifyUser(
@GetUserId() userId: number,
@Body(ParseUserUpdateDtoPipe, ValidationPipe) userUpdateDto: UserUpdateDto,
) {
await this.userService.updateUser(userId, userUpdateDto);
}
결과
{
"statusCode": 400,
"message": [
"nickname should not be one of the following values: "
],
"error": "Bad Request"
}
해결!!!! 원하는 응답이 왔습니다.
이렇게 삽질을 하고부터는 모든 컨트롤러 메소드에 Pipe와 변수명을 꼭 사용하고 있습니다. 하지만 계속 찜찜함이 남습니다. 애플리케이션이 커지면 모든 Dto를 검사할 때마다 Pipe를 만들어야 할 테니깐요.
728x90
'Javascript > NestJS' 카테고리의 다른 글
NestJS Provider, Service에 대해 알아보기 (0) | 2023.03.22 |
---|---|
NestJS Pipe에 대해 알아보기 (0) | 2023.03.14 |
NestJS Controller에 대해 알아보기 (0) | 2023.03.13 |
NestJS Module에 대해 알아보기 (0) | 2023.03.13 |
프로젝트 구조 (0) | 2023.03.13 |