문제
개발을 하던 도중 "Validation filed (numeric string is expected)" 오류 메세지가 떴다.
이 오류는 숫자로 파싱하려고 시도했으나 실제로는 숫자가 아닌 문자열을 받았기 때문에 발생한다.
그래서 평소와 같이 ParseIntPipe를 통해 숫자로 변환 시켰다.
@Get('byApplication')
@UseGuards(JwtAuthGuard, RolesGuard)
@ClubRoles('CLUBADMIN')
async getAppResponseByApplicationId(@Query('applicationId', ParseIntPipe) applicationId: number) {
console.log('Query parameters:', applicationId);
try {
const response = await this.applicationService.getAppResponseByApplicationId(applicationId);
if (!response) {
throw new NotFoundException(`No responses found for application ID ${applicationId}`);
}
return response;
} catch (error) {
throw new InternalServerErrorException('Failed to getAppResponse by ApplicationId');
}
}
그러나 오류 메세지는 사라지지 않고 똑같이 떴다.
그리고 console.log()를 통해 오류를 확인하려고 해도, console.log 또한 뜨지 않았다.
해결
이 오류는 라우팅 매칭 순서의 문제이다.
만약 아래와 같이 Query 통해 받는 정적 라우팅과 Param을 통해 받는 동적 라우팅이 있다고 가정해보자.
@Controller('club-admin/application')
export class ApplicationController {
// ... 다른 라우트들
@Get(':applicationId')
async getApplicationById(@Param('applicationId', ParseIntPipe) applicationId: number): Promise<Application> {
// ...
}
@Get('byApplication')
async getAppResponseByApplicationId(@Query('applicationId', ParseIntPipe) applicationId: number) {
// ...
}
// ... 다른 라우트들
}
이 때 :applicationid가 먼저 정의되어 있어 실제로 byApplication에 대한 요청이 들어오더라도 NestJS는 이를 applicationId라는 동적 파라미터로 인식하게 된다.
즉, byApplication이라는 문자열이 숫자로 변환될 수 없기 때문에 ParseIntPipe가 실패하여 위와 같은 오류가 발생하게 된다.
이를 해결하기 위해 동적 라우팅보다 정적 라우팅을 먼저 정의함으로써 파라미터로 인식하지 않게 설정한다.
@Controller('club-admin/application')
export class ApplicationController {
// ... 다른 라우트들
@Get(':applicationId')
async getApplicationById(@Param('applicationId', ParseIntPipe) applicationId: number): Promise<Application> {
// ...
}
@Get('byApplication')
async getAppResponseByApplicationId(@Query('applicationId', ParseIntPipe) applicationId: number) {
// ...
}
// ... 다른 라우트들
}
728x90
반응형