이상한 파라미터 경로 문제...

JinYoungMo·2024년 3월 29일
// 모든 판례 조회 API 
  @Get('cases')
  async getAllDetails(
    @Query('cursor') cursor: string,
    @Query('limit') limit: string,
    ){
      let cursorNumber = parseInt(cursor)
      let limitNumber = parseInt(limit)
      console.log(cursorNumber)
      console.log(limitNumber)

      if(isNaN(cursorNumber) || isNaN(limitNumber))
      {
        cursorNumber = 0;
        limitNumber = 10;
      }
      
    return await this.trialsService.getAllDetails(cursorNumber, limitNumber);
  }
  

이 api를 인섬니아에서 호출하였는데
자꾸 500번 에러가 발생하였다.
무슨 에러일까살펴보니...

뜬금없는

// 특정 재판 조회 API(회원/비회원 구분 X)
  @Get(':trialsId')
  async findOneByTrialsId(
    @Param('trialsId') id: number,
  ) {
    const data = await this.trialsService.findOneByTrialsId(+id);

    return  {
      statusCode: HttpStatus.OK,
      message: "재판 검색에 성공하였습니다.",
      data
    }
  }

이 api에서 받아서 지혼자 오류 뜨고 있는 것이였다...

원인을 살펴보니

문제의 원인은 라우팅 경로의 충돌 때문이였다. NestJS는 라우팅을 정의할 때 경로를 매칭하는 순서에 따라 어떤 핸들러가 호출될지 결정된다. 여기서는 두 라우트 @Get('cases')와 @Get(':trialsId')가 있다.

@Get('cases')는 특정한 경로(cases)를 명시적으로 지정한다.
@Get(':trialsId')는 경로 파라미터(trialsId)를 사용하여 어떤 값이든 받을 수 있는 더 일반적인 경로를 정의한다.
이 경우, @Get(':trialsId')는 모든 GET 요청을 받을 수 있는 "와일드카드" 역할을 하게 되어, /cases 경로로의 요청까지도 이 핸들러가 처리하려고 시도한다. 그 결과, /cases 경로로의 요청이 의도치 않게 findOneByTrialsId 핸들러에 의해 처리되고, 여기서 :trialsId가 /cases 문자열로 취급되어 NaN 오류가 발생하는 것이다....

그래서 // 모든 판례 조회 API 를 코드의 위쪽으로 하였더니 잘 해결되었다

profile
blockchain core & payments and stable coins

0개의 댓글