본문 바로가기

T.I.L

23-07-31 Error.captureStackTrace()/오류 해결한 과정

문제설명

계층화 아키텍쳐의 구조에서 에러가 발생한다면 status:400과 errorMessage를 보내도록 핸들링했다.

하지만 처음보는 에러가 발생했다.

Error.captureStackTrace()

지금까지 겪었던 에러는 할당을 제대로 안해서 undefined가 나오거나 객체을 잘 못 지정했거나 타입을 착각했을 때의 오류였고 에러메세지에는 어떤 부분이 에러인지 잘 나와있었지만 

Error.captureStackTrace()의 메세지는 노드 모듈에서부터 기인된 것 인지 어떤 부분이 잘 못 되었는지를 파악하기 힘들었다. 

 

시도

일단 에러메세지를 차근차근 읽어 보았다. 그리고 역시 특정 코드의 위치를 알려주지 않았다. 모든 에러메세지는 노드모듈에서 기인되었다.

내 짰던 코드를 전반적으로 훓어 보는 것 보다는 이 에러가 어떤 에러메세지인지 아는 것이 먼저라고 생각했기 때문에

구글링을 통해서 이 에러가 어떤 에러인지 알아보았다.

Error 메세지는 런타임 중 오류가 날 때 나타난다.

그리고 그 중 Error.captureStackTrace는 오류 인스턴스의 stack (en-US) 속성을 만드는 비표준 V8 함수라고 한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Error

물론 무슨 소리인지 모르겠다. 하지만 알아낸 것은 첫 번째로 런타임 중에 에러가 난 것,

두 번째는 console.log() 자체가 찍히고 있지 않다는 것이다.

작성했던 서버 자체는 켜졌다. 즉  module.exports와 함수의 참조는 제대로 이루어지고 있다는 것, 그리고 코드를 실행 할때 Error.captureStackTrace 메세지가 출력되고 console.log는 어디에도 찍히지 않는다.

그렇다면 controll쪽에서 어떤 문제의 코드가 있다는 유추가 가능하다. 

 

해결

내가 설계한 controll 쪽에서 return하는 방식은 아래와 같다.

 reDeleteItem = async (req, res, next) => {
    const {itemId} = req.params;
    const reitemId = req.cookies.deleteApi;
    console.log(reitemId, itemId);
    const { confirm } = req.body;
    const reDeleteItem = await this.itemService.reDeleteItem(
      itemId,
      reitemId,
      confirm
    );
    if (reDeleteItem.status === 400) {
      res.clearCookie("deleteApi");
      return await res.status(400).json({
        errorMessage: reDeleteItem.errorMessage,
      });
    }
    if (reDeleteItem.status === 400) {
      return await res.status(400).json({
        errorMessage: reDeleteItem.errorMessage,
      });
    } else {
      res.clearCookie("deleteApi");
      return await res.status(200).json({ message: reDeleteItem.message });
    }
  };
}

 그리고 어디가 잘 못 되었는지를 알 수 있었다.

바로 service에서 설계한 에러핸들링의 status의 번호가 달랐기 때문이다.

평소에는 오류가 날 때 400으로 통일을 했었지만 이번의 기능은 다양한 에러를 다뤄야 했기 때문에 status의 번호를 약간 다르게 분류를 했었다. 하지만 controll에서는 그 생각을 깜박했기 때문에 평소처럼 400으로만 다뤄서 에러가 났던 것이다.

  reDeleteItem = async (req, res, next) => {
    const {itemId} = req.params;
    const reitemId = req.cookies.deleteApi;
    console.log(reitemId, itemId);
    const { confirm } = req.body;
    const reDeleteItem = await this.itemService.reDeleteItem(
      itemId,
      reitemId,
      confirm
    );
    if (reDeleteItem.status === 402) {
      res.clearCookie("deleteApi");
      return await res.status(402).json({
        errorMessage: reDeleteItem.errorMessage,
      });
    }
    if (reDeleteItem.status === 400) {
      return await res.status(400).json({
        errorMessage: reDeleteItem.errorMessage,
      });
    } else {
      res.clearCookie("deleteApi");
      return await res.status(200).json({ message: reDeleteItem.message });
    }
  };
}

아래처럼 오류 번호를 알 맞게 설정하고 나니까 에러가 발생하지 않았다.

 

알게된 점

1.발송되는 status를 받을 곳이 없으면 Error.captureStackTrace의 에러메세지가 뜬다.

2.Error메세지는 런타임 오류 중에 뜬다, 서버가 강제종료가 되지 않게 하기 위해서는 try/catch문으로 이 에러를 핸들링 해야한다.

 

 

'T.I.L' 카테고리의 다른 글

23-08-03 forEach와 비동기  (0) 2023.08.03
23-07-27 enum 사용하기  (0) 2023.07.27
23-07-25 .env의 위치/enum의 설정  (0) 2023.07.26
23-07-20 restful한 계층형 아키텍쳐의 구조  (0) 2023.07.20
23-07-18 js와 html의 연동  (0) 2023.07.18