example code

import { NextFunction, Request, Response } from 'express';
import { CustomException } from './custom.exception';
import { getErrorResponse } from './error.response';
import { logger } from '../logging/logger';
import { InternalServerErrorException } from './exception/internal.server.error.exception';

type AsyncRequestHandler = (
  req: Request,
  res: Response,
  next: NextFunction
) => Promise<any>;

export const asyncErrorWrapper = (fn: AsyncRequestHandler) => {
  return async (req: Request, res: Response, next: NextFunction) => {
    try {
      await fn(req, res, next);
    } catch (error) {
      if (error instanceof CustomException) {
        res.status(error.statusCode).json(getErrorResponse(error, req.originalUrl));
      } else {
        logger.error(error);
        res.status(500).json(getErrorResponse(
          new InternalServerErrorException('Internal Server Error'),
          req.originalUrl
        ));
      }
    }
  };
};
this.router.post('/signup', asyncErrorWrapper(this.studentController.signUp.bind(this.studentController)));

**asyncErrorWrapper 함수를 정의**한 후 router에서 호출시에 감싸서 사용한다.


handling

위처럼 하는 방법도 있지만 Global적인 미들웨어를 등록해서 하는 방법도 존재하는데

왜인지 저 **if문을 미들웨어로 등록했을 때 잘 작동하지 않아서 미들웨어로 등록해서 사용**해보고 싶다.