Async Request handler

이재경·2022년 12월 28일
0

백엔드

목록 보기
4/7

asyncHandler는 requestHandler매개변수로 갖는 함수형 미들웨어
전달된 requestHandler는 try~catch로 감싸져 asyncHandler내에서 실행되고,
throw되는 에러는 자동으로 오류처리 미들웨어로 전달도록 구성됨

1.async-handler.js

module.exports = (requestHandler) => {
  return async (req, res, next) => {
    try{
await requestHandler(req,res)
    }catch(err){
next(err)
    }
  }
}

2.posts.js

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;
profile
코딩으로 빛나게

0개의 댓글