如何为登录API按IP设置速率限制而非全局?(express-rate-limit@2.11.0)
解决express-rate-limit全局拦截问题(v2.11.0)
嘿,我懂你现在的困扰——你当前应该是把limiter通过app.use(limiter)全局挂载了,所以所有API请求都会被限流。要实现仅针对特定API限流,只需要把这个限流中间件单独挂载到目标路由上就好,不用全局应用。
首先,先把你的limiter初始化代码补全整理下(确保语法完整):
const RateLimit = require('express-rate-limit'); const limiter = new RateLimit({ windowMs: 15*60*1000, // 15分钟的时间窗口 max: 100, // 每个窗口内允许的最大请求次数 delayMs: 0, // 不启用请求延迟 message: '==> You have made too many attempts in a short period of time, please try later', handler: (req, res) => { res.format({ json: () => { res.status(429).json({ message: 'You have made too many attempts in a short period of time, please try later' }); } }); } });
接下来,放弃全局挂载的方式,把limiter作为中间件按需添加到路由中:
具体实现示例
单个特定API限流
直接把limiter放在目标路由的中间件列表里:
// 这个路由会被限流 app.get('/api/user/profile', limiter, (req, res) => { res.json({ data: '用户个人信息接口(已限流)' }); }); // 这个路由不受限流影响 app.get('/api/public/news', (req, res) => { res.json({ data: '公开新闻接口(无限制)' }); });
一组特定API限流
如果有多个API需要统一限流,可以创建路由组,给整个组挂载limiter:
const express = require('express'); const authRouter = express.Router(); // 给整个认证路由组添加限流 authRouter.use(limiter); // 组内所有路由都会触发限流规则 authRouter.post('/login', (req, res) => { /* 登录逻辑 */ }); authRouter.post('/register', (req, res) => { /* 注册逻辑 */ }); authRouter.post('/reset-password', (req, res) => { /* 重置密码逻辑 */ }); // 把路由组挂载到主应用 app.use('/api/auth', authRouter); // 其他路由不受限流约束 app.get('/api/public/announcement', (req, res) => { /* ... */ });
这样设置后,只有你指定的路由会触发限流规则,其他API请求就不会被无故拦截啦。
内容的提问来源于stack exchange,提问作者Rakesh Kumar
相关产品推荐
相关产品推荐

