第一版提交,答题功能OK,题库管理待完善
This commit is contained in:
104
api/middlewares/index.ts
Normal file
104
api/middlewares/index.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
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();
|
||||
};
|
||||
Reference in New Issue
Block a user