/** * 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 };