81 lines
2.0 KiB
JavaScript
81 lines
2.0 KiB
JavaScript
|
|
// src/middlewares/error-handler.middleware.js
|
||
|
|
// 에러 핸들러 미들웨어
|
||
|
|
|
||
|
|
const logger = require('../config/logger.config');
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 전역 에러 핸들러
|
||
|
|
*/
|
||
|
|
module.exports = (err, req, res, _next) => {
|
||
|
|
// 에러 로깅
|
||
|
|
logger.error('에러 발생:', {
|
||
|
|
message: err.message,
|
||
|
|
stack: err.stack,
|
||
|
|
path: req.path,
|
||
|
|
method: req.method,
|
||
|
|
});
|
||
|
|
|
||
|
|
// Sequelize 유효성 검사 에러
|
||
|
|
if (err.name === 'SequelizeValidationError') {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
error: {
|
||
|
|
code: 'VALIDATION_ERROR',
|
||
|
|
message: '데이터 유효성 검사 실패',
|
||
|
|
details: err.errors.map((e) => ({
|
||
|
|
field: e.path,
|
||
|
|
message: e.message,
|
||
|
|
})),
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Sequelize 고유 제약 조건 에러
|
||
|
|
if (err.name === 'SequelizeUniqueConstraintError') {
|
||
|
|
return res.status(409).json({
|
||
|
|
success: false,
|
||
|
|
error: {
|
||
|
|
code: 'DUPLICATE_ENTRY',
|
||
|
|
message: '중복된 데이터가 존재합니다.',
|
||
|
|
details: err.errors.map((e) => ({
|
||
|
|
field: e.path,
|
||
|
|
message: e.message,
|
||
|
|
})),
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// JWT 에러
|
||
|
|
if (err.name === 'JsonWebTokenError') {
|
||
|
|
return res.status(401).json({
|
||
|
|
success: false,
|
||
|
|
error: {
|
||
|
|
code: 'INVALID_TOKEN',
|
||
|
|
message: '유효하지 않은 토큰입니다.',
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 기본 에러 응답
|
||
|
|
const statusCode = err.statusCode || 500;
|
||
|
|
const message = err.message || '서버 오류가 발생했습니다.';
|
||
|
|
|
||
|
|
// 프로덕션 환경에서는 상세 에러 숨김
|
||
|
|
const response = {
|
||
|
|
success: false,
|
||
|
|
error: {
|
||
|
|
code: err.code || 'INTERNAL_ERROR',
|
||
|
|
message: process.env.NODE_ENV === 'production' && statusCode === 500
|
||
|
|
? '서버 오류가 발생했습니다.'
|
||
|
|
: message,
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
// 개발 환경에서는 스택 트레이스 포함
|
||
|
|
if (process.env.NODE_ENV === 'development') {
|
||
|
|
response.error.stack = err.stack;
|
||
|
|
}
|
||
|
|
|
||
|
|
return res.status(statusCode).json(response);
|
||
|
|
};
|