Nest는 @Catch(HttpException) 이런식으로 공식문서에서 쉽게 되어 있던데,
Express는 뭔가 불편하다.
내가 여태껏 했던 것들은 API단위에서의 에러를 처리하고, 다음 공통된 에러 미들웨어에서
에러 레벨에 맞게 객체만들고, 클라쪽으로 넘겨서 처리하는 방식이 많았는데,
그렇게 했던 이유는 실력 부족도 있고, 결국은 이게 모든 에러를 다 컨트롤 한다고 잘못된 생각을 했다.
전역에서 에러를 관리하면 더 좋다는 피드백을 들었다.
그전에는 morgan, winston, slack으로 로깅을 할 때도 api단위에서의 에러를 로깅했었다.
error.filter.ts
import { Request, Response, NextFunction } from 'express';
class AppError extends Error {
statusCode: number;
constructor(statusCode: number, message: string) {
super(message);
Object.setPrototypeOf(this, new.target.prototype);
this.name = Error.name;
this.statusCode = statusCode;
Error.captureStackTrace(this);
}
}
const logger = (error: Error, request: Request, response: Response, next: NextFunction) => {
console.log(`error ${error.message}`);
// 여기서 로깅 처리하면 되겠다.
next(error);
};
const responder = (error: AppError, request: Request, response: Response, next: NextFunction) => {
response.header('Content-Type', 'application/json');
const status = error.statusCode || 400;
response.status(status).send(error.message);
};
const invalidPathHandler = (request: Request, response: Response, next: NextFunction) => {
response.status(404);
response.send('invalid path');
};
const error = {
logger,
responder,
invalidPathHandler,
};
export = error;
이렇게 에러레벨에 맞게 만들고,
app을 구동시킬 때 use함수를 이용해서 넣어주자.
app.ts
...
app.use(error.logger);
app.use(error.responder);
app.use(error.invalidPathHandler);
httpServer.listen(process.env.PORT, () => {
console.log(`🛡️ Server listening on port: ${process.env.PORT}🛡️`);
});
여기서 ... 은 애플리케이션 단계의 처리와, 라우팅 단계의 처리들이다.
그것들이 모두 처리되고 난 뒤, 전역에서 핸들링할 에러는 애플리케이션 단계에서 처리해준다.
logger에서 에러 로깅을 하면 되겠고,
responder는 에러를 반환
invalidPathHandler는 잘못된 경로에 대한 반환
연휴인데 일단 백엔드말고 나부터 에러핸들링을 좀 해야될 것 같다..
'Back > Node.js' 카테고리의 다른 글
[GPT, Node.js, React] 실시간으로 ChatGPT 연동하기 (0) | 2023.04.08 |
---|---|
[NodeJs, Notion] Nodejs + Notion database 연동하기 및 만들기 (0) | 2022.09.09 |
[NodeJs, Typescript] nodemailer 이메일 보내기 (0) | 2022.09.07 |
[Nodejs, TypeScript] 도메인 로직 리팩토링 (0) | 2022.08.05 |
[Nodejs, GraphQL] Middleware(미들웨어) 만들기 (0) | 2022.08.04 |