Express.js의 에러 처리 미들웨어

  • 에러 처리 미들웨어는 Express.js가 공식적으로 제공하는 기능으로, 아래와 같은 구조를 가지고 있다.
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

 

 에러 처리 미들웨어의 항목

  • err : 이전 미들웨어에서 발생한 에러를 전달받은 객체
  • req, res : 일반적으로 사용하는 HTTP 요청과 응답을 관리 하는 객체
  • next : 다음 미들웨어를 실행하는 함수

에러를 인자로 전달받아 클라이언트에게 에러 응답을 반환하거나 다음 미들웨어로 에러를 전달하는 역할을 담당한다.

( Express.js에서 미들웨어나 라우터에서 에러가 발생하면, 해당 에러를 next 함수를 통해 다음 미들웨어로 전달한다. 그리고 Express.js는 등록된 미들웨어 중 에러를 매개변수로 받는 미들웨어를 찾아 실행하게 되는 것 )

 

에러 발생 시 에러를 처리하는 미들웨어 작성

export default function (err, req, res, next) {
  console.error(err);

  // Joi 검증에서 에러가 발생하면, 클라이언트에게 에러 메시지를 전달한다.
  if (err.name === 'ValidationError') {
    return res.status(400).json({ errorMessage: err.message });
  }

  // 그 외의 에러가 발생하면, 서버 에러로 처리한다.
  return res
    .status(500)
    .json({ errorMessage: '서버에서 에러가 발생하였습니다.' });
}

 

에러 처리 미들웨어 등록

import ErrorHandlerMiddleware from './middlewares/error-handler.middleware.js';

app.use('/api', [router, TodosRouter]);

app.use(ErrorHandlerMiddleware); // 에러 핸들링 미들웨어 등록

 

  • 에러 처리 미들웨어를 Router 하단에 등록해야 이전 미들웨어에서 발생한 에러에 대해 핸들링 할 수 있다. ( next()를 통해 에러 처리 미들웨어로 전달하기 때문에 )

+ Recent posts