문제 상황
•
어떤 것을 하려다가 문제가 발생했는가?
◦
3층 캐비넷 반납시 반납할때, 반납 비밀번호를 입력받는 기능 추가가 필요한 상황
◦
따라서 Controller 메소드 추가가 필요하여 추가
◦
/42cabi/backend/src/lent/lent.controller.ts 에 추가된 returnCabinetAndUpdateMemeo 메소드
◦
/api/lent/return-memo
◦
하지만 /api/lent/return-memo 요청시 BanService 관련 에러 발생
•
발생한 환경, 프로그램
◦
dev 브렌치
◦
be/dev/feat_get_password_3rd_floor_cabinet/#1059
◦
Postman 에서의 POST 요청
•
발생한 문제(에러)
◦
3층 캐비넷 반납과는 전혀 상관이 없는 BanService가 호출 되는 문제가 발생했다.
◦
처음에 이 서비스가 어디서 호출되는건지 싶었는데, BanService 를 사용하는 것은 컨트롤러에서 lentCabinet 메소드만 사용하고 있었다. 따라서 console.log 로 찍어보았으나,
터미널에는 나오지 않았다.
◦
lentCabinet 메소드가 호출된 것은 맞다 하지만 Controller 안에 들어가기 전에 BanCheckGuard 인터셉터에서 터져서, console.log(”HERE”) 가 출력되지 않았다.
◦
아무튼 /api/lent/return-memo 를 예상하고 호출했으나,
/api/lnet/:cabinet_id 가 호출되는 문제
원인
•
추정되는 원인
◦
API “return-memo” 문자열 파싱 문제가 아니었을까?
◦
대충 API 파싱 문제겠거니 싶었음
•
실제 원인
◦
nest 에서 Controller URI 파싱 우선순위 문제
◦
위와 같은 상황일때, /api/lent 로 들어오는 모든 POST 요청은 lentCabinet 이 가져간다
▪
/api/lent/return-memo 든, /api/lent/hacking 이든 상관없이 모든 요청은 /:cabinet_id 로 여겨진다
최종 해결
•
최종 해결을 위한 시행착오(optional)
◦
위에 서술함
•
해결방법
◦
express / nest 에서 Controller 를 파싱하는 로직이 어떻게 작성되어있는지 정확히는 모르지만,
콜론( : ) 을 만났을때, “ / “ 가 아닌 뒤에 나오는 모든 문자열은 파라미터 변수명이라고 인식된다.
◦
따라서 :변수명 과 같은 가변 uri 를 받을때, 앞에 루트 를 하나 설정 해주어야 한다.
ex) /:cabinet_id ⇒ /cabinet/:cabinet_id
◦
혹은 그대로 사용해야 하는 경우라면, /return-memo 를 받는 메소드를 /:cabinet_id 요청을 받는 메소드 보다 위에 올려놓으면, 위에서 부터 매칭하기 때문에 정상작동한다.
참고자료
•
예전에 했던 삽질 뉴런속 기억
•
상제님과의 대화