request handler에서 오류를 처리하기 위한 방법은 두 가지가 있습니다.
promise().catch(next)
async function, try ~ catch, next
async 함수를 작성해 비동기 처리를 구현하면 매우 편하지만 매번 그 안에서 try-catch 문을 작성하는 번거로움이 있습니다.
이를 해결하기 위해 asyncHandler
를 따로 구현해줍니다.
const asyncHandler = (requestHandler) => {
return async (req, res, next) => {
try {
await requestHandler(req, res);
} catch (err) {
next(err);
}
}
}
그리고 async로 진행되는 미들웨어를 asyncHandler로 감싸서 throw되는 에러를 처리합니다.
router.get('/', asyncHandler(async (req, res) => {
const posts = await Posts.find({});
if (posts.length < 1) {
throw new Error('Not Found');
}
res.render('posts/list', { posts });
});
이렇게 되면 중간중간 발생되는 에러 때문에 매번 try-catch문을 작성할 필요없이 asyncHandler 함수로 한번만 더 감싸서 코드를 작성하면 되기 때문에 불필요한 코드 작성 시간을 줄여주고 코드의 가독성도 높여주는 장점이 있습니다.
좋은 방식이라고 생각되어 따로 한번 더 정리하였습니다.
이 글은 엘리스 SW 엔지니어 트랙을 기반으로 작성되었습니다.