개발 중 API NOT Found 발생

ansunny1170·2023년 6월 13일
0

개발

목록 보기
5/15

시작하는 말

개발 중, 내가 만든 api를 테스트 할 때 API Not Found라는 에러를 발생시키는 것은 참 낯선 상황입니다.
postman을 사용하면 오탈자의 사유로 발생할 수 있지만, swagger를 사용하는 상황에는 처음 맞닥뜨리는 상황이었습니다.

API Not Found 에러 이유

에러 발생 코드

@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() 핸들러를 호출합니다.

예외상황 - 1

/:orderId/hi 와 같이 hi경로를 추가해주면 /carriers 경로를 메개변수로 인식하지 않아 에러를 발생시키지 않습니다.

정상 작동 코드

@Get('/:orderId/hi')
async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) {
  // ...
}  

@Get('/carriers')
async getCarriers(@AuthPayload() authPayload: IAuthPayload) {
  // ...
}

예외상황 - 2

/:orderId 다음 경로 핸들러에 특정 경로가 선언되지 않으면, 매개변수로 인식하지 않아 정상작동 합니다.

정상 작동 코드

@Get('/:orderId')
async getOrdersSheet(@AuthPayload() authPayload: IAuthPayload, @Param('orderId') orderId: string) {
  // ...
}  

@Get('')
async getCarriers(@AuthPayload() authPayload: IAuthPayload) {
  // ...
}

마치며

이 문제를 해결하려면 경로 핸들러가 올바른 순서로 정의되었는지 확인하고 보다 일반적인 경로보다 구체적인 경로를 먼저 정의해야 합니다.

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글