Files
Web_BLV_OA_Exam_Prod/api/middlewares/index.ts

94 lines
2.3 KiB
TypeScript
Raw Normal View History

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) => {
// 简化处理,接受任何请求,允许管理员访问
// 实际生产环境应该使用JWT token验证
next();
};
// 请求日志中间件
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();
};