Nest.js에서 다음과 같은 경우 에러가 발생할 수 있다.
@Get('/:testId')
async testId(@Param('testId') testId: number) {
return testId;
}
@Get('/test')
async test() {
}
이 경우 /test
로 호출을 해도 /:testId
에 요청이 간다. _testId_라는 변수는 Number 값이므로, NaN 에러가 발생하게 된다.
이런 문제는 익스프레스의 미들웨어가 순차적으로 실행되기 때문이다. 선언된 순서가 URI의 우선순위에 영향을 미친다.
즉 요청의 조건에 부합하는 두 개 이상의 api가 있을 때, 코드 내부에서 먼저 선언된 api가 호출되는 것이다.
때문에 /test
가 위로 오게 되면, 이전과 같은 에러는 발생하지 않는다.
@Get('/test')
async test() {
}
@Get('/:testId')
async testId(@Param('testId') testId: number) {
return testId;
}
http://localhost:3000/1
로 요청을 보내면, 이 요청이 /test
로 보내는 요청이 아님을 확인한 뒤 /:testId
로 요청이 가게 되는 것이다.
처음엔 Nest.js에서 이걸 어떻게 해결하지 않았을까? @Param()
혹은 @Get()
이런 거에 어떤 속성을 추가하면 우선순위가 바뀌지 않을까? 라고 생각했는데 express의 철학을 존중해주기로 했나보다.
Middleware functions are executed sequentially, therefore the order of middleware inclusion is important.
[express 공식 홈페이지(출처)](http://expressjs.com/en/api.html)
아무튼 그래서...정렬 순서를 바꾸는 걸로 해결되는 문제라니 되긴 했는데 RESTful한 코드 작성을 저해하는 요소 같이 느껴져서 썩 좋은 기분은 아니었다. ....
'DEVELOPMENT > NODEJS' 카테고리의 다른 글
AES with Nest.js + BASE64 (0) | 2022.09.26 |
---|---|
TypeORM where (in 0.3.x) (2) | 2022.09.25 |
Node.js BASE64로 AWS S3에 이미지 업로드하기 (0) | 2022.04.17 |
cookie 데코레이터에서 JWT payload 추출하기 (0) | 2022.04.15 |
cookie 데코레이터에서 JWT payload 추출하기 (0) | 2022.04.08 |