首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以为同一航线设置多个限价吗?

我可以为同一航线设置多个限价吗?
EN

Stack Overflow用户
提问于 2021-01-12 08:21:13
回答 1查看 721关注 0票数 2

我可以为我的快速服务器设置一个全局rateLimit,也可以为某些路由设置一个更严格的rateLimit吗?

例如:

代码语言:javascript
复制
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包的正常使用,还是反模式?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-12 12:17:45

express-rate-limit是一个相当受欢迎的软件包。所以我不认为这是反模式。

中间件可以链接在一起。

例如,您希望将someRouteLimitapiLimit同时强加于/some-route

代码语言:javascript
复制
app.get("/some-route",apiLimit,someRouteLimit,routeHandler)

中间件是按顺序执行的,因此您希望将限制更严格的中间件放在较宽松的中间件之后。

表示中间件层次结构:

  1. Application-level middleware
  2. Router-level中间件

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

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

app.jsindex.js

代码语言:javascript
复制
// 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的限制)

代码语言:javascript
复制
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限制)

代码语言:javascript
复制
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和自定义助手函数有一些更有创造性的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65680226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档