Search
Duplicate
🔫

nest controller 파싱 에러

분야
BE
COMMON
ISSUE
주제
BE
테스트
심각도
중간😵
제보자
sanan
담당자
작성자
상태
처리 완료
이슈링크(optional)
작성일자
2023/04/27 09:31
공개여부
공개
글감
회고
노트
NestJS

문제 상황

어떤 것을 하려다가 문제가 발생했는가?
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 요청을 받는 메소드 보다 위에 올려놓으면, 위에서 부터 매칭하기 때문에 정상작동한다.

참고자료

예전에 했던 삽질 뉴런속 기억
상제님과의 대화