70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
![]() |
// src/middleware/error.middleware.js
|
||
|
const { logger, auditLogger } = require("../config/logger");
|
||
|
|
||
|
const errorHandler = (err, req, res) => {
|
||
|
err.statusCode = err.statusCode || 500;
|
||
|
err.status = err.status || "error";
|
||
|
|
||
|
// 운영 환경과 개발 환경의 에러 응답 구분
|
||
|
if (process.env.NODE_ENV === "development") {
|
||
|
logger.error(err.stack);
|
||
|
|
||
|
res.status(err.statusCode).json({
|
||
|
status: err.status,
|
||
|
message: err.message,
|
||
|
errors: err.errors,
|
||
|
stack: err.stack,
|
||
|
});
|
||
|
} else {
|
||
|
// 운영 환경에서는 스택 트레이스 제외
|
||
|
logger.error(err.message, {
|
||
|
status: err.status,
|
||
|
statusCode: err.statusCode,
|
||
|
errors: err.errors,
|
||
|
});
|
||
|
|
||
|
// 운영 환경에서는 일반적인 에러 메시지만 전송
|
||
|
if (err.isOperational) {
|
||
|
res.status(err.statusCode).json({
|
||
|
status: err.status,
|
||
|
message: err.message,
|
||
|
errors: err.errors,
|
||
|
});
|
||
|
} else {
|
||
|
// 프로그래밍 에러의 경우 일반적인 에러 메시지 전송
|
||
|
res.status(500).json({
|
||
|
status: "error",
|
||
|
message: "Something went wrong!",
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// 감사 로그 미들웨어
|
||
|
const auditMiddleware = (req, res, next) => {
|
||
|
const startTime = Date.now();
|
||
|
|
||
|
// 응답이 완료된 후 로깅
|
||
|
res.on("finish", () => {
|
||
|
const duration = Date.now() - startTime;
|
||
|
|
||
|
auditLogger.info({
|
||
|
type: "API_ACCESS",
|
||
|
method: req.method,
|
||
|
path: req.path,
|
||
|
statusCode: res.statusCode,
|
||
|
duration,
|
||
|
userId: req.user?.id,
|
||
|
ip: req.ip,
|
||
|
userAgent: req.headers["user-agent"],
|
||
|
});
|
||
|
});
|
||
|
|
||
|
next();
|
||
|
};
|
||
|
|
||
|
module.exports = {
|
||
|
errorHandler,
|
||
|
auditMiddleware,
|
||
|
};
|