如何解决我可以使用 express-rate-limit 为相同的路线设置多个速率限制吗?
我可以为我的 express 服务器设置一个全局 rateLimit
并为某些路由设置一个更严格的 rateLimit
吗?
例如:
const globalLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 500 // MAX 500 REQUESTS
});
const apiLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 100 // MAX 100 REQUESTS
});
const someRouteLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 10 // MAX 10 REQUESTS
});
app.use("/",globalLimit); // ALL ROUTES WILL BE LIMITED BY THE globalLimit
app.use("/api",apiLimit); // API ROUTES WILL BE LIMITED BY THE apiLimit
app.get("/some-route",someRouteLimit,routeHandler); // THIS ROUTE WILL BE LIMITED BY THE someRouteLimit
它会像我想要的那样工作吗?这是 express-rate-limit
包的正常使用还是反模式?
解决方法
express-rate-limit
是一个非常流行的包。所以我不认为这是一种反模式。
中间件可以链接起来。
例如,您想在 someRouteLimit
上同时施加 apiLimit
和 /some-route
app.get("/some-route",apiLimit,someRouteLimit,routeHandler)
中间件是按顺序执行的,所以你想把限制性更强的放在宽松的之后。
Express 中间件层次结构:
- 应用级中间件
- 路由器级中间件
app.use("/",globalLimit)
是一个应用级中间件,因此它将在所有其他中间件之前执行,但在其他应用级中间件之前/之后执行,具体取决于它们的调用顺序。
您还可以使用路由器对路由进行分组,并在特定路由器上应用速率限制中间件。
在您的 app.js
或 index.js
中:
// Depedencies
const express = require('express')
const rateLimit = require('express-rate-limit')
// Initialize the app
const app = express()
const globalLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 500 // MAX 500 REQUESTS
});
const apiLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 100 // MAX 100 REQUESTS
});
// Load Routes
const routeOne = require('./routes/routeOne');
const routeTwo = require('./routes/routeTwo');
// Use routes
app.use('/',routeOne,apiLimit); // Impose apiLimit on this router
app.use('/',routeTwo); // No router-level middleware is applied
app.listen(portNumber)
在 routeOne 中:(受 globalLimit
和 apiLimit
限制)
const express = require('express');
const router = express.Router();
const rateLimit = require('express-rate-limit')
const someRouteLimit = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 10 // MAX 10 REQUESTS
});
// Some Route (further restricted by someRouteLimit)
router.post('/some-route',routeHandler);
module.exports = router;
在 RouteTwo 中:(受 globalLimit
限制但不受 apiLimit
限制)
const express = require('express');
const router = express.Router();
const rateLimit = require('express-rate-limit')
const someRouteLimit2 = rateLimit({
windowMs: 60 * 60 * 1000,// 1 HOUR
max: 10 // MAX 10 REQUESTS
});
// Some Route (further restricted by someRouteLimit2)
router.post('/some-route2',routeHandler);
module.exports = router;
如果您想以更自定义的方式实现您的中间件,可以使用 this post 中的正则表达式和自定义辅助函数来提供一些更具创意的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。