我可以为我的快速服务器设置一个全局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包的正常使用,还是反模式?
发布于 2021-01-12 12:17:45
express-rate-limit是一个相当受欢迎的软件包。所以我不认为这是反模式。
中间件可以链接在一起。
例如,您希望将someRouteLimit和apiLimit同时强加于/some-route。
app.get("/some-route",apiLimit,someRouteLimit,routeHandler)中间件是按顺序执行的,因此您希望将限制更严格的中间件放在较宽松的中间件之后。
表示中间件层次结构:
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',someRouteLimit, 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',someRouteLimit, routeHandler);
module.exports = router;如果您希望以更自定义的方式实现中间件,那么在this post中使用regex和自定义助手函数有一些更有创造性的方法。
https://stackoverflow.com/questions/65680226
复制相似问题