지난 글에서 미들웨어를 만들어봤는데, 이번엔 오류 처리 미들웨어를 활용해서 코드를 조금 더 리팩토링 해볼 예정이다.
물론 백엔드에서 가능한 모든 오류처리를 세세하게 해주면 좋지만, 가끔 예상하지 못한 오류가 날 때도 있다. 오류 발생시 서버가 멈춰버리기 때문에 일단 모든 로직을 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));