const limiter = new RateLimiter(options);检查请求是否在限流内。
const result = await limiter.check('user-123', { route: '/api/data' });
// result 对象包含:
// {
// allowed: boolean, // 是否允许请求
// limit: number, // 限制数
// current: number, // 当前计数
// remaining: number, // 剩余请求数
// resetTime: number, // 重置时间(毫秒)
// retryAfter: number, // 重试等待时间(毫秒)
// }创建中间件函数。
const middleware = limiter.middleware();
// Express
app.use(middleware);
// Koa
app.use(middleware);重置特定键的限制计数。
await limiter.reset('user-123');重置所有键的限制计数。
await limiter.resetAll();当设置 headers: true 时,会添加以下响应头:
X-RateLimit-Limit- 允许的最大请求数X-RateLimit-Remaining- 当前窗口剩余请求数X-RateLimit-Reset- 速率限制重置的时间(Unix 时间戳)Retry-After- 重试前等待的秒数(仅在速率受限时)
主类,用于创建限流器实例。
const { RateLimiter } = require('rate-limit');Redis 存储后端。
const { RedisStore } = require('rate-limit');内存存储后端(通常不需要直接使用)。
const { MemoryStore } = require('rate-limit');预定义的键生成器对象。
const { keyGenerators } = require('rate-limit');
// 可用的生成器:
// - keyGenerators.ip
// - keyGenerators.userId
// - keyGenerators.routeAndIp
// - keyGenerators.apiEndpoint
// - keyGenerators.userAndRoutetry {
const result = await limiter.check('user-123');
} catch (error) {
if (error.message.includes('windowMs')) {
// windowMs 配置错误
} else if (error.message.includes('max')) {
// max 配置错误
} else if (error.message.includes('algorithm')) {
// algorithm 配置错误
} else if (error.message.includes('键')) {
// 键为空或非法
} else {
// 其他错误
}
}const { RateLimiter } = require('rate-limit');
const limiter = new RateLimiter({
windowMs: 60000,
max: 10,
});
const result = await limiter.check('user-123');
if (result.allowed) {
console.log('请求被允许');
} else {
console.log('超过限制,请等待', result.retryAfter, 'ms');
}const express = require('express');
const { RateLimiter } = require('rate-limit');
const app = express();
const limiter = new RateLimiter({
windowMs: 60000,
max: 100,
});
// 全局应用
app.use(limiter.middleware());
// 或特定路由
app.get('/api/data', limiter.middleware(), (req, res) => {
res.json({ data: 'success' });
});const { RateLimiter, RedisStore } = require('rate-limit');
const Redis = require('ioredis');
const redis = new Redis('redis://localhost:6379');
const limiter = new RateLimiter({
windowMs: 60000,
max: 100,
store: new RedisStore({
client: redis,
prefix: 'rl:',
}),
});使用指南:
返回:
- 📖 文档中心 - 查看所有文档和学习路径
const limiter = new RateLimiter({
windowMs: 60000,
max: async (req) => {
const user = await getUser(req.user.id);
return user.isPremium ? 1000 : 100;
},
});const limiter = new RateLimiter({
windowMs: 60000,
max: 100,
handler: (req, res) => {
res.status(429).json({
error: '请求过于频繁',
retryAfter: Math.ceil(req.rateLimit.resetTime / 1000),
});
},
});