保险前后端,养殖端和保险端小程序
This commit is contained in:
101
backend/middleware/apiMiddleware.js
Normal file
101
backend/middleware/apiMiddleware.js
Normal file
@@ -0,0 +1,101 @@
|
||||
/**
|
||||
* API统一中间件
|
||||
* 处理所有API请求的统一格式和错误处理
|
||||
*/
|
||||
|
||||
const { buildSuccessResponse, buildErrorResponse, handlePagination, handleFilters, handleSorting } = require('../config/api-config');
|
||||
|
||||
/**
|
||||
* API请求统一处理中间件
|
||||
* @param {Object} req - Express请求对象
|
||||
* @param {Object} res - Express响应对象
|
||||
* @param {Function} next - 下一个中间件
|
||||
*/
|
||||
const apiMiddleware = (req, res, next) => {
|
||||
// 记录请求日志
|
||||
console.log(`[API] ${req.method} ${req.originalUrl}`, {
|
||||
query: req.query,
|
||||
body: req.body,
|
||||
params: req.params
|
||||
});
|
||||
|
||||
// 添加统一的响应方法
|
||||
res.apiSuccess = (data = null, message = '操作成功', options = {}) => {
|
||||
buildSuccessResponse(res, data, message, options);
|
||||
};
|
||||
|
||||
res.apiError = (message = '操作失败', code = 'UNKNOWN_ERROR', statusCode = 500) => {
|
||||
buildErrorResponse(res, message, code, statusCode);
|
||||
};
|
||||
|
||||
// 添加分页处理方法
|
||||
req.getPagination = () => handlePagination(req);
|
||||
|
||||
// 添加筛选条件处理方法
|
||||
req.getFilters = (allowedFields = []) => handleFilters(req, allowedFields);
|
||||
|
||||
// 添加排序处理方法
|
||||
req.getSorting = (allowedFields = []) => handleSorting(req, allowedFields);
|
||||
|
||||
next();
|
||||
};
|
||||
|
||||
/**
|
||||
* 统一错误处理中间件
|
||||
* @param {Error} err - 错误对象
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
* @param {Function} next - 下一个中间件
|
||||
*/
|
||||
const errorHandler = (err, req, res, next) => {
|
||||
console.error('[API Error]', {
|
||||
message: err.message,
|
||||
stack: err.stack,
|
||||
url: req.url,
|
||||
method: req.method,
|
||||
body: req.body,
|
||||
query: req.query
|
||||
});
|
||||
|
||||
// Sequelize数据库错误
|
||||
if (err.name && err.name.includes('Sequelize')) {
|
||||
return res.apiError('数据库操作失败', 'DATABASE_ERROR', 500);
|
||||
}
|
||||
|
||||
// 验证错误
|
||||
if (err.name === 'ValidationError') {
|
||||
return res.apiError('数据验证失败', 'VALIDATION_ERROR', 400);
|
||||
}
|
||||
|
||||
// JWT认证错误
|
||||
if (err.name === 'JsonWebTokenError') {
|
||||
return res.apiError('Token无效', 'INVALID_TOKEN', 401);
|
||||
}
|
||||
|
||||
if (err.name === 'TokenExpiredError') {
|
||||
return res.apiError('Token已过期', 'TOKEN_EXPIRED', 401);
|
||||
}
|
||||
|
||||
// 默认错误处理
|
||||
res.apiError(
|
||||
process.env.NODE_ENV === 'development' ? err.message : '服务器内部错误',
|
||||
'INTERNAL_ERROR',
|
||||
500
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 404处理中间件
|
||||
* @param {Object} req - 请求对象
|
||||
* @param {Object} res - 响应对象
|
||||
* @param {Function} next - 下一个中间件
|
||||
*/
|
||||
const notFoundHandler = (req, res, next) => {
|
||||
res.apiError('接口不存在', 'NOT_FOUND', 404);
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
apiMiddleware,
|
||||
errorHandler,
|
||||
notFoundHandler
|
||||
};
|
||||
Reference in New Issue
Block a user