[Express.js] error middleware

스윗포테이토·2023년 1월 15일
1

지난 글에서 미들웨어를 만들어봤는데, 이번엔 오류 처리 미들웨어를 활용해서 코드를 조금 더 리팩토링 해볼 예정이다.

물론 백엔드에서 가능한 모든 오류처리를 세세하게 해주면 좋지만, 가끔 예상하지 못한 오류가 날 때도 있다. 오류 발생시 서버가 멈춰버리기 때문에 일단 모든 로직을 try-catch 블록으로 감싸고 있는데, 중복 코드가 너무 많다. 따라서 오류처리 미들웨어를 하나 만들어서 리팩토링을 해보려고 한다.

다른 미들웨어와는 다르게, 오류처리 미들웨어는 파라미터를 하나 더 받는다.

function defaultErrorHandler(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send("something broke...");
}

이제 router의 가장 상단 코드(main.js, index.js, router.js 등)에서 오류 처리 미들웨어를 적용해주면 된다.
주의할 점은, express는 미들웨어를 적용할 때 코드 순서대로 적용하기 때문에 가장 마지막에 작성해주어야 한다.

...

app.use(errorHandler.default);

// 서버 시작
app.listen(port, () => {
  console.log(`listening ${port}`);
});

이렇게 되면, 오류 발생시 errorHandler()가 호출되고 서버는 멈추지 않고 500번 에러를 클라이언트로 전송할 것이다.

비동기 에러처리

그렇지만, async 함수의 경우는 위의 방법으로 해결할 수 없다.
말 그대로 비동기로 처리되기 때문인데... 따라서 wrapper가 필요하다.

const asyncErrorHandlerWrapper = (asyncFunc) => {
  return (req, res, next) => {
    asyncFunc(req, res, next).catch(next);
  };
};

이제 비동기 처리를 할 때 위 함수로 감싸서 보내면 된다.

router.post('/', asyncErrorHandlerWrapper(postSomething));

reference

Error-handling middleware

profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글