首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用express- rate -limit为单个路由设置不同的速率限制器

使用express- rate -limit为单个路由设置不同的速率限制器
EN

Stack Overflow用户
提问于 2021-11-08 05:32:30
回答 1查看 50关注 0票数 0

我有一条像这样的快车路线。

代码语言:javascript
复制
router.route('/sign-upload').post(signUpload)

我想根据请求对此路由使用不同的速率限制器。

代码语言:javascript
复制
router.route('/sign-upload').post(function (req, res, next) {
switch (req.body.qty) {
  case 'one':
    console.log('case one')
    B1Limiter
    break
  case '10-50':
    console.log('case 10-50')
    B10To50Limiter
    break
  case '50-250':
    console.log('case 50-250')
    B50To250Limiter
    break
  case '250-1000':
    console.log('case  250-1000')
    B250To1kLimiter
    break
  default:
    console.log('case default')
    B1Limiter
    break
}
next()},signUpload)

下面是我的限制:

代码语言:javascript
复制
import rateLimit from 'express-rate-limit'

// B1 15req/hr
export const B1Limiter = rateLimit({
  windowMs: 60 * 60 * 1000,
  max: 15, 
  message: 'Too many requests from this IP. Please try again after an hour',
})

// B10-50 300req/day
export const B10To50Limiter = rateLimit({
  windowMs: 24 * 60 * 60 * 1000,
  max: 300,
  message: 'Too many requests from this IP. Please try again tomorrow',
})

// B50-250 750req/3 days
export const B50To250Limiter = rateLimit({
  windowMs: 3 * 24 * 60 * 60 * 1000,
  max: 750,
  message: 'Too many requests from this IP. Please try again after three days',
})

// B250-1000 3kreq/week
export const B250To1kLimiter = rateLimit({
  windowMs: 7 * 24 * 60 * 60 * 1000,
  max: 3000, 
  message: 'Too many requests from this IP. Please try again after week',
})

此代码的速率限制器未执行。我不知道为什么。

我不能使用单个限制器,因为windowMs和message不是函数。https://github.com/nfriedly/express-rate-limit/issues/122

如果我移除开关外壳,只使用一个限制器,则限制器可以工作

代码语言:javascript
复制
router.route('/sign-upload').post(B1Limiter,signUpload)

这是否意味着我必须为每个速率限制器创建单独的路由?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 06:21:22

您可以有条件地选择并执行您想要的中间件,如下所示:

代码语言:javascript
复制
router.route('/sign-upload').post(function (req, res, next) {
    let limiter = B1Limiter;
    switch (req.body.qty) {
      case 'one':
        console.log('case one')
        limiter = B1Limiter
        break
      case '10-50':
        console.log('case 10-50')
        limiter = B10To50Limiter
        break
      case '50-250':
        console.log('case 50-250')
        limiter = B50To250Limiter
        break
      case '250-1000':
        console.log('case  250-1000')
        limiter = B250To1kLimiter
        break
      default:
        console.log('case default')
        limiter = B1Limiter
        break
    }
    // now call the selected middleware and
    // let it handle calling next()
    limiter(req, res, next);
}, signUpload);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69879008

复制
相关文章

相似问题

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