推荐答案
// www.javascriptcn.com code example
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();
// 创建限流中间件
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100, // 每个IP在15分钟内最多允许100次请求
message: '请求过于频繁,请稍后再试。',
headers: true, // 在响应头中添加限流信息
});
// 应用限流中间件
app.use(limiter);
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('服务器运行在 http://localhost:3000');
});本题详细解读
1. 什么是 express-rate-limit?
express-rate-limit 是一个用于 Express 应用程序的中间件,用于限制来自同一 IP 地址的请求频率。它可以帮助防止滥用 API 或 DDoS 攻击。
2. 如何安装 express-rate-limit?
在项目目录中运行以下命令来安装 express-rate-limit:
npm install express-rate-limit
3. rateLimit 配置选项
windowMs: 时间窗口的长度,单位为毫秒。例如,15 * 60 * 1000表示 15 分钟。max: 在时间窗口内允许的最大请求次数。例如,100表示每个 IP 在 15 分钟内最多允许 100 次请求。message: 当请求超过限制时返回的错误消息。headers: 布尔值,表示是否在响应头中添加限流信息(如X-RateLimit-Limit和X-RateLimit-Remaining)。
4. 应用限流中间件
通过 app.use(limiter) 将限流中间件应用到整个应用程序。你也可以将限流中间件应用到特定的路由上,例如:
app.use('/api/', limiter);5. 自定义限流逻辑
你可以通过 keyGenerator 选项自定义限流的键值生成逻辑。例如,根据用户 ID 而不是 IP 地址进行限流:
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
keyGenerator: (req) => req.user.id, // 根据用户ID限流
});6. 处理限流错误
当请求超过限制时,express-rate-limit 会返回一个 429 状态码(Too Many Requests),并附带配置的 message。你可以通过自定义 handler 选项来处理限流错误:
// www.javascriptcn.com code example
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
handler: (req, res) => {
res.status(429).json({
error: '请求过于频繁,请稍后再试。',
});
},
});