asyncHandler는 requestHandler를 매개변수로 갖는 함수형 미들웨어
전달된 requestHandler는 try~catch로 감싸져 asyncHandler내에서 실행되고,
throw되는 에러는 자동으로 오류처리 미들웨어로 전달도록 구성됨
module.exports = (requestHandler) => {
return async (req, res, next) => {
try{
await requestHandler(req,res)
}catch(err){
next(err)
}
}
}
const { Router } = require('express');
const { Post } = require('../models');
const asyncHandler = require('../utils/async-handler');
const router = Router();
router.get('/', asyncHandler(async (req, res) => {
if (req.query.write) {
res.render('post/edit');
return;
}
const posts = await Post.find({});
res.render('post/list', { posts });
}));
router.get('/:shortId',asyncHandler(async (req, res) => {
const { shortId } = req.params;
const post = await Post.findOne({ shortId });
if (req.query.edit) {
res.render('post/edit', { post });
return;
}
res.render('post/view', { post });
}));
router.post('/', asyncHandler(async (req, res) => {
const { title, content } = req.body;
if (!title || !content) {
throw new Error('제목과 내용을 입력해 주세요');
}
const post = await Post.create({ title, content });
res.redirect(`/posts/${post.shortId}`);
}));
router.post('/:shortId',asyncHandler(async (req, res, next) => {
const { shortId } = req.params;
const { title, content } = req.body;
try {
if (!title || !content) {
throw new Error('제목과 내용을 입력해 주세요');
}
await Post.updateOne({ shortId }, { title, content });
res.redirect(`/posts/${shortId}`);
} catch (err) {
next(err);
}
}));
router.delete('/:shortId',asyncHandler(async (req, res, next) => {
const { shortId } = req.params;
await Post.deleteOne({ shortId });
res.send('OK');
}));
module.exports = router;