| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- "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
|