clouddisk-project/backend/src/middleware/rateLimit.js

44 lines
1.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 简单的请求频率限制中间件
const rateLimit = {};
const rateLimitMiddleware = (req, res, next) => {
const ip = req.ip || req.connection.remoteAddress;
const now = Date.now();
const windowMs = 60000; // 1分钟
const maxRequests = 100; // 每分钟最多100次
if (!rateLimit[ip]) {
rateLimit[ip] = { count: 1, resetTime: now + windowMs };
return next();
}
// 检查是否在时间窗口内
if (now > rateLimit[ip].resetTime) {
rateLimit[ip] = { count: 1, resetTime: now + windowMs };
return next();
}
// 检查请求次数
if (rateLimit[ip].count >= maxRequests) {
return res.status(429).json({
error: 'Too many requests',
retryAfter: Math.ceil((rateLimit[ip].resetTime - now) / 1000)
});
}
rateLimit[ip].count++;
next();
};
// 清理过期的记录每5分钟
setInterval(() => {
const now = Date.now();
for (const ip in rateLimit) {
if (now > rateLimit[ip].resetTime) {
delete rateLimit[ip];
}
}
}, 300000);
module.exports = rateLimitMiddleware;