NestJS Validation failed, 라우팅 시스템으로 인한 오류

임동혁 Ldhbenecia·2023년 11월 29일
1

NestJS

목록 보기
3/4
post-thumbnail

NestJS Validation failed (numeric string is expected)

프로젝트를 진행하며 방금 겪은 오류를 정리합니다.
위의 오류를 겪었으나, 이슈는 전혀 달랐습니다.


Validation failed (numeric string is expected)

이것이 무슨 에러일까? 읽는 그대로 유효성 검사에 실패했다는 오류입니다.
해석을 해보면 숫자 값과 문자열 값 사이 예상되는 부분이 달라서 뱉어내는 오류로 보입니다.

프로젝트를 진행하며 분명히 이상한 코드가 없었는데 위의 오류가 계속해서 나왔습니다.

@Get('/by-date')
async getMogacoByDate(@Query('date') date: string): Promise<MogacoDto[]> 
    return this.mogacoService.getMogacoByDate(date);
  }

컨트롤러단의 해당 부분이며 전혀 문제될 것이 없습니다.
쿼리스트링으로 key 값으로 'date'를 받고 그에 대한 타입은 string으로 해놓았습니다.
이 말인 즉슨 유효성 검사가 갑자기 터질 이유가 전혀 없습니다.

{
    "message": "Validation failed (numeric string is expected)",
    "error": "Bad Request",
    "statusCode": 400
}

하지만 위와 같은 오류가 계속해서 발생하였습니다.

해결

병목지점에 대한 파악을 할 수가 없었습니다.
콘솔을 찍어보아도 해당 요청으로 들어가면서 바로 오류를 반환했기 때문에 에러코드는 저것이 전부였습니다.

콘솔로그가 나오지 않는다? -> 라우팅 과정에서 문제가 발생했다. -> 유효성오류가 발생한다?

이 로직을 따라가보았고 정답을 알 수 있었습니다.


@Get('/')
async getAllMogaco(): Promise<Mogaco[]> {
  return this.mogacoService.getAllMogaco();
}
  
@Get('/by-date')
async getMogacoByDate(@Query('date') date: string): Promise<MogacoDto[]> {
  return this.mogacoService.getMogacoByDate(date);
}

@Get('/:id')
async getMogacoById(@Param('id', ParseIntPipe) id: number): Promise<MogacoWithMemberDto> {
  return this.mogacoService.getMogacoById(id);
}

위와 같이 사이에 있는 많은 코드들 사이에서
:id 위로 해당 함수를 옮기자 해결되었습니다.

Get에서 :id 인 API가 존재합니다.
여기서 느낌이 온 점은 쿼리스트링으로 반환을 할 때 validation이 자꾸 걸린다는 점이었는데
저 해당 부분에서 병목지점이 발생하진 않았을까? 의심이 들었고 위로 올렸더니 전부 해결되었습니다.

NestJS의 라우팅 시스템

NestJS의 라우팅 시스템은 URL 패턴을 분석하고 첫 번째로 매치되는 라우트 핸들러를 실행한다고 합니다.

아마 이 시스템에서 매칭을 :id로 했기 때문에 id값에 있는 ParseIntPipe에서 계속 걸려서 유효성 에러가 난 듯 싶습니다.

대체 매칭 시스템이 어떻게 되어있길래 :id랑 /by-date?date=2023 이거를 매칭을 못하나 싶은 생각이 들었습니다.

결론적으로 해결했고, 다음에도 이러한 상황이 온다면 쉽게 해결할 수 있을 것 같습니다.

위와 같은 오류가 뜨면 유효성 문제에 대해서 먼저 생각해보고 그 다음은
이 이슈를 떠올려보면 좋을 것 같습니다.

profile
지극히 평범한 공대생

2개의 댓글

comment-user-thumbnail
2024년 11월 23일

감사합니다

1개의 답글

관련 채용 정보