104 lines
2.6 KiB
TypeScript
104 lines
2.6 KiB
TypeScript
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();
|
|
}; |