flex-rate-limit
Node.js 通用速率限制模块 - 框架无关、灵活且生产就绪

✨ 特性
- 🚀 框架无关核心 -
check() 可接入 Express、Koa、Egg.js、Hapi、Fastify 等主流框架
- 🎯 多种算法 - 滑动窗口、令牌桶、漏桶、固定窗口
- 💾 多种存储后端 - 内存、Redis、自定义适配器
- 🔧 高度可配置 - 根据需求微调速率限制
- 🌐 分布式就绪 - 内置 Redis 支持分布式系统
- 📊 标准响应信息 - 返回限制上限、当前计数、剩余额度、重置时间和重试时间
- 🛡️ 生产可用 - 提供单元/集成测试,并支持 Redis 分布式部署
- 💡 简单 API - 易于集成,直观易用
📦 安装
npm install flex-rate-limit
Redis 支持:
npm install flex-rate-limit ioredis
🚀 快速开始
最简单的例子
const { RateLimiter } = require('flex-rate-limit');
const limiter = new RateLimiter({
windowMs: 15 * 60 * 1000,
max: 100,
});
app.use(limiter.middleware());
const result = await limiter.check('user-123');
if (!result.allowed) {
return res.status(429).json({ error: '请求过于频繁' });
}
Express 示例
const express = require('express');
const { RateLimiter } = require('flex-rate-limit');
const app = express();
const globalLimiter = new RateLimiter({
windowMs: 15 * 60 * 1000,
max: 100,
});
app.use(globalLimiter.middleware());
const loginLimiter = new RateLimiter({
windowMs: 15 * 60 * 1000,
max: 5,
});
app.post('/api/login', loginLimiter.middleware(), (req, res) => {
res.json({ message: '登录成功' });
});
app.listen(3000);
其他框架
支持所有主流 Node.js 框架:
- Koa - 异步中间件模式
- Egg.js - 中间件工厂模式
- Hapi - 预检查函数模式
- Fastify - 钩子函数模式
查看完整的框架集成示例:docs/getting-started/quickstart.md
📚 文档
👉 📚 完整文档导航 - 查看所有文档、学习路径、场景查找
Website 站点基于 Rspress 构建,内容源复用 docs/:
npm run docs:dev
npm run docs:build
快速入口
更多文档
🎯 核心概念
业务锁 - 用户级别精细化限流 ⭐⭐⭐
支持基于 用户ID + 路由 的限流,每个用户在每个接口独立计数:
const { RateLimiter } = require('flex-rate-limit');
const limiter = new RateLimiter({
windowMs: 15 * 60 * 1000,
max: 5,
keyGenerator: (ctx) => {
const userId = ctx.user?.id || ctx.ip;
return `user:${userId}:${ctx.path}`;
},
});
使用场景:
- ✅ 防止用户恶意刷接口
- ✅ 公平分配API配额
- ✅ 公司网络/校园网用户互不影响
- ✅ 精确控制每个用户的行为
详见:业务锁完整指南
IP 白名单与访问控制 ⭐⭐
支持 IP 白名单/黑名单,可指定路由只允许特定 IP 访问:
const { RateLimiter } = require('flex-rate-limit');
const limiter = new RateLimiter({
windowMs: 60 * 1000,
max: 100,
skip: (req) => ['127.0.0.1', '192.168.1.100'].includes(req.ip),
});
const adminLimiter = new RateLimiter({
skip: (req) => !['192.168.1.10', '192.168.1.11'].includes(req.ip),
handler: (req, res) => {
res.status(403).json({ error: '只有授权 IP 可以访问' });
},
});
app.use('/api/admin', adminLimiter.middleware());
const limiter = new RateLimiter({
max: (req) => ['1.2.3.4'].includes(req.ip) ? 1 : 100,
});
完整文档: 高级用法 - IP 白名单章节
动态 IP 白名单配置 ⭐⭐⭐
支持 全局 + 路由级 IP 白名单、动态配置和多种配置方式:
配置示例:
const globalWhitelist = ['127.0.0.1', '192.168.1.100'];
const routeWhitelists = {
'/api/admin': ['192.168.1.10', '192.168.1.11'],
'/api/internal': ['10.0.0.0/8', '192.168.0.0/16'],
};
动态管理 API:
POST /api/whitelist/global/add
POST /api/whitelist/global/remove
POST /api/whitelist/route/add
GET /api/whitelist/config
环境变量配置(生产环境推荐):
GLOBAL_IP_WHITELIST=127.0.0.1,192.168.1.1 \
ADMIN_IP_WHITELIST=192.168.1.10,192.168.1.11 \
node app.js
完整示例:
- Express:
express-ip-whitelist-independent.js ⭐(推荐:独立版本)
- Koa:
koa-ip-whitelist-independent.js ⭐
- Egg.js:
egg-ip-whitelist-advanced.js
⚠️ 重要说明 - 白名单与限流的关系:
有两种实现方式,根据你的需求选择:
| 耦合版本 | ❌ 不限流(跳过) | 白名单 = 特权用户 | express-ip-whitelist-advanced.js |
| 独立版本 ⭐ | ✅ 限流(独立) | 白名单 = 访问控制 | express-ip-whitelist-independent.js |
独立版本示例(推荐):
app.get('/api/admin/users',
ipWhitelistMiddleware('/api/admin'),
createRateLimiter({ max: 200 }),
handler
);
详细说明: 白名单与限流独立性文档
配置文件: config/ip-whitelist.json
⚠️ 重要:配置场景说明
在使用 IP 白名单功能前,请了解以下配置场景:
| 只配置限流 | 所有 IP 可访问 + 限流 | 未配置白名单 = 允许所有 |
| 只配置白名单 | 白名单 IP 无限制访问 | ⚠️ 不推荐(无限流保护) |
| 白名单 + 限流 | 白名单验证 → 限流检查 | ✅ 最推荐(双重保护) |
| 全局白名单 | 所有路由通用 + 各自限流 | ✅ 适合办公室网络 |
关键要点:
- ✅ 未配置白名单 = 允许所有 IP(不是拒绝所有)
- ✅ 白名单 IP 也会被限流(独立版本)
- ✅ 全局白名单优先级更高(但仍需限流)
- ✅ 推荐配置:白名单 + 限流一起使用
详细配置场景: 配置场景完整文档
预定义限制级别
根据不同场景快速配置限流级别:
const limit = {
strict: 5,
normal: 50,
relaxed: 200,
};
app.post('/api/login', limiter.middleware({ max: limit.strict }), handler);
app.get('/api/data', limiter.middleware({ max: limit.relaxed }), handler);
路由级配置
const limiter = new RateLimiter({
perRoute: {
'/api/login': { max: 5, windowMs: 15 * 60 * 1000 },
'/api/users': { max: 100, windowMs: 60 * 1000 },
},
});
支持所有框架
app.post('/api/login', limit.strict, controller.login);
router.post('/api/login', limit.strict, controller.login);
router.post('/api/login', limit.strict, controller.auth.login);
📝 示例文件
查看 examples/ 目录获取完整的可运行示例:
按框架分类
-
Express:
quickstart-express.js - 快速开始
express-router-example.js - 路由级限流
express-ip-whitelist-independent.js ⭐ - IP白名单(独立版本,推荐)
express-ip-whitelist-advanced.js - IP白名单(耦合版本)
-
Koa:
quickstart-koa.js - 快速开始
koa-router-example.js - 路由级限流
koa-ip-whitelist-independent.js ⭐ - IP白名单(独立版本)
-
Egg.js:
quickstart-egg.js - 快速开始
egg-router-example.js - 路由级限流
egg-business-lock-example.js ⭐ - 业务锁(用户+路由)
egg-ip-whitelist-advanced.js - IP白名单
-
其他框架:
- Hapi:
quickstart-hapi.js, hapi-example.js
- Fastify:
quickstart-fastify.js, fastify-router-example.js
按功能分类
- 🚀 快速开始:
quickstart-*.js
- 🔒 IP 白名单:
*-ip-whitelist-*.js (推荐使用 independent 版本)
- 👤 业务锁:
egg-business-lock-example.js
- 🔧 独立使用:
standalone-example.js
🧪 测试
npm test
npm run test:unit
npm run test:integration
npm run coverage
🔗 相关项目
💬 支持
📄 许可证
MIT
由 vext.js 团队用 ❤️ 制作