推荐答案
// www.javascriptcn.com code example
const Koa = require('koa');
const ratelimit = require('koa-ratelimit');
const Redis = require('ioredis');
const app = new Koa();
// 使用 Redis 作为存储后端
const db = new Redis();
app.use(ratelimit({
driver: 'redis',
db: db,
duration: 60000, // 限制时间窗口为 1 分钟
max: 100, // 在时间窗口内允许的最大请求数
id: (ctx) => ctx.ip, // 使用客户端 IP 作为唯一标识符
errorMessage: '请求过于频繁,请稍后再试。',
headers: {
remaining: 'Rate-Limit-Remaining',
reset: 'Rate-Limit-Reset',
total: 'Rate-Limit-Total'
}
}));
app.use(async (ctx) => {
ctx.body = 'Hello, World!';
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});本题详细解读
1. 引入依赖
首先,我们需要引入 koa、koa-ratelimit 和 ioredis 模块。koa-ratelimit 是一个用于限制请求频率的中间件,而 ioredis 是一个 Redis 客户端库,用于存储请求计数。
2. 创建 Koa 应用
创建一个 Koa 应用实例,并配置 koa-ratelimit 中间件。
3. 配置 koa-ratelimit
在 koa-ratelimit 的配置中,我们指定了以下参数:
driver: 'redis':使用 Redis 作为存储后端。db: db:传入 Redis 客户端实例。duration: 60000:设置时间窗口为 1 分钟(60000 毫秒)。max: 100:在 1 分钟内允许的最大请求数为 100。id: (ctx) => ctx.ip:使用客户端的 IP 地址作为唯一标识符。errorMessage: '请求过于频繁,请稍后再试。':当请求超过限制时返回的错误信息。headers:自定义响应头,用于显示剩余的请求次数、重置时间和总请求次数。
4. 处理请求
在 koa-ratelimit 中间件之后,我们定义了一个简单的路由处理函数,返回 "Hello, World!"。
5. 启动服务器
最后,启动 Koa 应用并监听 3000 端口。
通过以上配置,koa-ratelimit 中间件会根据客户端的 IP 地址限制其请求频率,防止恶意请求或滥用 API。