import multer from 'multer'; import { Request, Response, NextFunction } from 'express'; // 文件上传配置 const storage = multer.memoryStorage(); export const upload = multer({ storage, limits: { fileSize: 10 * 1024 * 1024 // 10MB限制 }, fileFilter: (req, file, cb) => { // 只允许Excel文件 const allowedTypes = [ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel' ]; if (allowedTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error('只允许上传Excel文件')); } } }); // 错误处理中间件 export const errorHandler = (err: any, req: Request, res: Response, next: NextFunction) => { console.error('错误:', err); if (err instanceof multer.MulterError) { if (err.code === 'LIMIT_FILE_SIZE') { return res.status(400).json({ success: false, message: '文件大小不能超过10MB' }); } return res.status(400).json({ success: false, message: '文件上传失败' }); } if (err.message) { return res.status(400).json({ success: false, message: err.message }); } res.status(500).json({ success: false, message: '服务器内部错误' }); }; // 管理员认证中间件(简化版) export const adminAuth = (req: Request, res: Response, next: NextFunction) => { // 简化处理,接受任何 Bearer 令牌或无令牌访问 // 实际生产环境应该使用JWT token验证 const token = req.headers.authorization; // 允许任何带有 Bearer 前缀的令牌,或者无令牌访问 if (token && token.startsWith('Bearer ')) { next(); } else { return res.status(401).json({ success: false, message: '未授权访问' }); } }; // 请求日志中间件 export const requestLogger = (req: Request, res: Response, next: NextFunction) => { const start = Date.now(); res.on('finish', () => { const duration = Date.now() - start; console.log(`${req.method} ${req.path} - ${res.statusCode} - ${duration}ms`); }); next(); }; // 响应格式化中间件 export const responseFormatter = (req: Request, res: Response, next: NextFunction) => { const originalJson = res.json; res.json = function(data: any) { // 如果数据已经是标准格式,直接返回 if (data && typeof data === 'object' && 'success' in data) { return originalJson.call(this, data); } // 否则包装成标准格式 return originalJson.call(this, { success: true, data }); }; next(); };