微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以使用 express-rate-limit 为相同的路线设置多个速率限制吗?

如何解决我可以使用 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 中间件层次结构:

  1. 应用级中间件
  2. 路由器级中间件

app.use("/",globalLimit) 是一个应用级中间件,因此它将在所有其他中间件之前执行,但在其他应用级中间件之前/之后执行,具体取决于它们的调用顺序。

您还可以使用路由器对路由进行分组,并在特定路由器上应用速率限制中间件。

在您的 app.jsindex.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 中:(受 globalLimitapiLimit 限制)

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 举报,一经查实,本站将立刻删除。