75 lines
1.4 KiB
JavaScript
75 lines
1.4 KiB
JavaScript
/**
|
|
* 统一错误处理中间件
|
|
*/
|
|
|
|
/**
|
|
* 404 错误处理
|
|
*/
|
|
function notFound(req, res, next) {
|
|
const error = new Error(`Not Found - ${req.originalUrl}`);
|
|
error.statusCode = 404;
|
|
next(error);
|
|
}
|
|
|
|
/**
|
|
* 统一错误响应处理
|
|
*/
|
|
function errorHandler(err, req, res, next) {
|
|
// 设置状态码
|
|
const statusCode = err.statusCode || 500;
|
|
|
|
// 开发环境返回详细错误信息,生产环境返回简化信息
|
|
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
|
|
res.status(statusCode).json({
|
|
success: false,
|
|
message: err.message || '服务器内部错误',
|
|
error: isDevelopment ? {
|
|
stack: err.stack,
|
|
...err
|
|
} : undefined,
|
|
statusCode
|
|
});
|
|
|
|
// 记录错误日志
|
|
if (statusCode >= 500) {
|
|
console.error('❌ Server Error:', {
|
|
message: err.message,
|
|
stack: err.stack,
|
|
url: req.originalUrl,
|
|
method: req.method,
|
|
body: req.body,
|
|
query: req.query,
|
|
params: req.params
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 异步错误捕获包装器
|
|
*/
|
|
function asyncHandler(fn) {
|
|
return (req, res, next) => {
|
|
Promise.resolve(fn(req, res, next)).catch(next);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 自定义错误类
|
|
*/
|
|
class AppError extends Error {
|
|
constructor(message, statusCode = 500) {
|
|
super(message);
|
|
this.statusCode = statusCode;
|
|
this.isOperational = true;
|
|
Error.captureStackTrace(this, this.constructor);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
notFound,
|
|
errorHandler,
|
|
asyncHandler,
|
|
AppError
|
|
};
|