개발 중, 내가 만든 api를 테스트 할 때 API Not Found
라는 에러를 발생시키는 것은 참 낯선 상황입니다.
postman을 사용하면 오탈자의 사유로 발생할 수 있지만, swagger를 사용하는 상황에는 처음 맞닥뜨리는 상황이었습니다.
에러 발생 코드
@Get('/:orderId') async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) { // ... } @Get('/carriers') async getCarriers(@AuthPayload() authPayload: IAuthPayload) { // ... }
위와 같이 경로 핸들러를 정의하는 순서는 액세스 가능성에 영향을 줄 수 있습니다. 예시의 코드에는 getCarriers()
및 getOrdersSheet()
라는 두 개의 경로 핸들러가 있습니다.
첫 번째 코드 스니펫에서 getCarriers()
핸들러는 getOrdersSheet()
핸들러 다음에 정의됩니다. 즉, Express 서버가 /carriers
에 대한 요청을 수신하면 /
경로 다음에 /carriers
경로를 일치시키고 orderId
매개변수가 'carriers
로 설정된 getOrdersSheet()
핸들러를 호출합니다. '. 결과적으로 "carriers" API는 별도의 경로가 아닌 orderId
매개변수로 처리되기 때문에 찾을 수 없습니다.
정상 작동 코드
// Correct order @Get('/carriers') async getCarriers(@AuthPayload() authPayload: IAuthPayload) { // ... } @Get('/:orderId') async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) { // ... }
두 번째 코드 스니펫에서는 경로 핸들러의 순서를 바꿨습니다. 이제 getCarriers()
핸들러는 getOrdersSheet()
핸들러 전에 정의됩니다. 즉, Express 서버가 /carriers
에 대한 요청을 수신하면 /carriers
경로를 구체적으로 일치시키고 예상대로 getCarriers()
핸들러를 호출합니다.
/:orderId/hi
와 같이 hi경로를 추가해주면 /carriers
경로를 메개변수로 인식하지 않아 에러를 발생시키지 않습니다.
정상 작동 코드
@Get('/:orderId/hi') async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) { // ... } @Get('/carriers') async getCarriers(@AuthPayload() authPayload: IAuthPayload) { // ... }
/:orderId
다음 경로 핸들러에 특정 경로가 선언되지 않으면, 매개변수로 인식하지 않아 정상작동 합니다.
정상 작동 코드
@Get('/:orderId') async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) { // ... } @Get('') async getCarriers(@AuthPayload() authPayload: IAuthPayload) { // ... }
이 문제를 해결하려면 경로 핸들러가 올바른 순서로 정의되었는지 확인하고 보다 일반적인 경로보다 구체적인 경로를 먼저 정의해야 합니다.