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에서 호출시에 감싸서 사용한다.
위처럼 하는 방법도 있지만 Global적인 미들웨어를 등록해서 하는 방법도 존재하는데
왜인지 저 **if문을 미들웨어로 등록했을 때 잘 작동하지 않아서 미들웨어로 등록해서 사용
**해보고 싶다.