"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.catchAsync = exports.notFound = exports.errorHandler = exports.AppError = void 0; const loggerService_1 = require("../services/loggerService"); class AppError extends Error { constructor(message, statusCode) { super(message); this.statusCode = statusCode; this.isOperational = true; Error.captureStackTrace(this, this.constructor); } } exports.AppError = AppError; const sendErrorDev = (err, res) => { res.status(err.statusCode).json({ status: 'error', error: err, message: err.message, stack: err.stack }); }; const sendErrorProd = (err, res) => { if (err.isOperational) { res.status(err.statusCode).json({ status: 'error', message: err.message }); } else { console.error('ERROR 💥', err); res.status(500).json({ status: 'error', message: '服务器内部错误' }); } }; const handleDBError = (err) => { if (err.code === 'ER_NO_SUCH_TABLE') { return new AppError('数据表不存在,请检查数据库设置', 500); } if (err.code === 'ER_ACCESS_DENIED_ERROR') { return new AppError('数据库访问被拒绝,请检查权限设置', 500); } if (err.code === 'ECONNREFUSED') { return new AppError('无法连接到数据库,请检查数据库服务器状态', 500); } if (err.code === 'ER_BAD_FIELD_ERROR') { return new AppError('数据库字段错误', 400); } return new AppError('数据库操作失败', 500); }; const errorHandler = (err, req, res, next) => { err.statusCode = err.statusCode || 500; err.status = err.status || 'error'; loggerService_1.LoggerService.error('发生错误', { source: 'error_handler', module: 'global', details: JSON.stringify({ statusCode: err.statusCode, message: err.message, path: req.path, method: req.method, ip: req.ip, userAgent: req.get('user-agent') }) }).catch(logErr => { console.error('错误日志写入失败:', logErr); }); if (err.code && typeof err.code === 'string' && err.code.startsWith('ER_')) { err = handleDBError(err); } if (process.env.NODE_ENV === 'development') { sendErrorDev(err, res); } else { sendErrorProd(err, res); } }; exports.errorHandler = errorHandler; const notFound = (req, res, next) => { const err = new AppError(`找不到路由 ${req.originalUrl}`, 404); loggerService_1.LoggerService.warn('未找到路由', { source: 'error_handler', module: 'not_found', details: JSON.stringify({ path: req.originalUrl, method: req.method, ip: req.ip }) }).catch(logErr => { console.error('404错误日志写入失败:', logErr); }); next(err); }; exports.notFound = notFound; const catchAsync = (fn) => { return (req, res, next) => { fn(req, res, next).catch(next); }; }; exports.catchAsync = catchAsync; //# sourceMappingURL=errorHandler.js.map