Node.js 我可以为同一条线路设置多个速度限制吗?

Node.js 我可以为同一条线路设置多个速度限制吗?,node.js,express,express-rate-limit,Node.js,Express,Express Rate Limit,我是否可以为我的express server设置全局费率限制,并为某些路线设置更严格的费率限制 例如: const globalLimit = rateLimit({ windowMs: 60 * 60 * 1000, // 1 HOUR max: 500 // MAX 500 REQUESTS }); const apiLimit = rateLimit({ windowMs: 60 * 60 * 1000,

我是否可以为我的express server设置全局
费率限制
,并为某些路线设置更严格的
费率限制

例如:

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

它会按照我的意愿工作吗?这是正常使用的
快速费率限制
套餐还是反模式?

快速费率限制
套餐颇受欢迎。所以我不认为这是一种反模式

中间件可以链接

例如,您希望在
/some route
上同时施加
someRouteLimit
apiLimit

app.get(“/some route”,apiLimit,sometroutelimit,routeHandler)
中间件是按顺序执行的,因此您希望将更严格的中间件放在更宽松的中间件之后

快速中间件层次结构:

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

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

    在您的
    app.js
    index.js
    中:

    //依赖关系
    const express=require('express')
    const rateLimit=require('express-rate-limit')
    //初始化应用程序
    const app=express()
    const globalLimit=速率限制({
    windowMs:60*60*1000,//1小时
    最多:500//最多500个请求
    });
    const apiLimit=费率限制({
    windowMs:60*60*1000,//1小时
    最多:100//最多100个请求
    });
    //装货路线
    const routeOne=需要('./路由/routeOne');
    const routeTwo=要求('./路由/路由);
    //使用路线
    应用程序使用(“/”,routeOne,apiLimit);//对这个路由器施加限制
    应用程序使用(“/”,routeTwo);//没有应用路由器级中间件
    app.listen(端口号)
    
    在routeOne中:(受
    globalLimit
    APLimit
    限制)

    const express=require('express');
    const router=express.router();
    const rateLimit=require('express-rate-limit')
    const someRouteLimit=费率限制({
    windowMs:60*60*1000,//1小时
    最多:10//最多10个请求
    });
    //某些路线(进一步受到someRouteLimit的限制)
    router.post('/some route',some routelimit,routeHandler);
    module.exports=路由器;
    
    在路由器中:(受
    globalLimit
    限制,但不受
    apiLimit
    限制)

    const express=require('express');
    const router=express.router();
    const rateLimit=require('express-rate-limit')
    const someRouteLimit2=费率限制({
    windowMs:60*60*1000,//1小时
    最多:10//最多10个请求
    });
    //某些路线(进一步受到someRouteLimit2的限制)
    router.post('/some-route2',someRouteLimit,routeHandler);
    module.exports=路由器;
    
    如果您想以更定制的方式实现中间件,那么在中有一些更具创造性的方法使用regex和customhelper函数