controller 내부에서 동적 라우트를 사용하는 controller가 존재했다.
그런데 그 하위에 같은 http Methods로 다른 request 요청을 했는데 계속 오류가 나왔다.
controller내부 함수에 console조차 나오지 않아 이상해서 계속 찾아봤는데 아래와 같은 원인이 있었다.
// 동적 파라미터를 사용하는 라우트는 마지막에 배치
@Get(':id')
@ApiOperation({ summary: '특정 인덱스 조회' })
@ApiResponse({
status: HttpStatus.OK,
description: '특정 인덱스를 조회합니다.',
})
// ParseIntPipe를 통해서 param string값을 숫자로 변환
async findOne(@Param('id', ParseIntPipe) id: number) {
const result = await this.listsService.findOne(id);
if (!result) {
throw new NotFoundException(`ID ${id}인 리스트를 찾을 수 없습니다.`);
}
return result;
}
위와같이 동적 파라미터를 사용하는 메소드가 있다면 파일 내 하단에 배치해야 한다.
NestJS(Express 기반)에서 라우트 매칭이 작동하는 방식 때문입니다.
예를 들어서 다음과 같은 순서로 라우트가 정의되어 있다고 한다면
@Get(':id')
findOne() { ... }
@Get('search')
search() { ... }
이 경우:
올바른 순서
@Get('search') // 1. 구체적인 경로 먼저
search() { ... }
@Get(':id') // 2. 동적 파라미터는 나중에
findOne() { ... }
이렇게 하면:
즉, NestJS는
위에서 아래로
라우트를 매칭하므로:
정의해야 모든 엔드포인트가 의도한 대로 동작합니다.