diff --git a/src/app.ts b/src/app.ts index a539b2e..d83c6da 100644 --- a/src/app.ts +++ b/src/app.ts @@ -3,9 +3,12 @@ import express from 'express'; import { Action, useExpressServer } from 'routing-controllers'; import { UserService } from './services/UserService'; import { AuthHelper } from './utils/AuthHelper'; +import { ErrorManager } from './utils/ErrorManager'; -// TODO: Sentry 401, 400, 404, 403, 405, 422 코드는 에러 로깅 하지 않도록 필터 생성 -Sentry.init({ dsn: process.env.SENTRY_DSN }); +Sentry.init({ + dsn: process.env.SENTRY_DSN, + beforeSend: event => ErrorManager.ignoreFilter(event) ? null : event, +}); const app: express.Application = express(); @@ -45,8 +48,8 @@ app.use(Sentry.Handlers.errorHandler()); // TODO: 모든 에러 response 같은 형태로 보내주도록 추가 app.use((err: any, _: express.Request, res: express.Response, ___: express.NextFunction) => { if (!res.headersSent) { - // console.error(err); - res.status(err.httpCode || 500).send(err.message || 'something is wrong'); + const errorBody = ErrorManager.parse(err); + res.status(errorBody.httpCode).send(errorBody.message); } }); diff --git a/src/errors/UnProcessableError.ts b/src/errors/UnProcessableError.ts new file mode 100644 index 0000000..0cd555f --- /dev/null +++ b/src/errors/UnProcessableError.ts @@ -0,0 +1,7 @@ +import { HttpError } from 'routing-controllers'; + +export class UnProcessableError extends HttpError { + constructor(message: string) { + super(422, message || 'request body is unprocessable'); + } +} diff --git a/src/utils/ErrorManager.ts b/src/utils/ErrorManager.ts new file mode 100644 index 0000000..739f947 --- /dev/null +++ b/src/utils/ErrorManager.ts @@ -0,0 +1,35 @@ +import * as Sentry from '@sentry/node'; +import { HttpError } from 'routing-controllers'; +import { QueryFailedError } from 'typeorm'; +export class ErrorManager { + + // TODO: 센트리에 로깅 할 필요가 없는 에러 필터 정리, 로그인 실패, 권한 없음 등등 + public static ignoreFilter(event: Sentry.Event) { + return true; + } + + // TODO: 에러를 메시지로 파싱하는 객체, 에러 별로 다른 내용을 잘 보여줄 수 있도록 수정 + public static parse(error: HttpError | QueryFailedError | Error) { + if (error instanceof HttpError) { + return { + httpCode: error.httpCode || 500, + name: error.name, + message: error.message || 'something is wrong', + }; + } + if (error instanceof QueryFailedError) { + return { + httpCode: 400, + name: error.name, + message: error.message, + stack: error.stack, + }; + } + return { + httpCode: 500, + name: error.name, + message: error.message || 'something is wrong', + trace: error.stack, + }; + } +}