duckil_plm/fems-api/src/middleware/error.middleware.js

70 lines
1.7 KiB
JavaScript
Raw Normal View History

2024-11-09 05:59:59 +09:00
// 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,
};