Express中间件中的速率限制异常吗?

时间:2019-03-05 02:02:52

标签: express exception rate-limiting

在Express.js应用程序中,我们希望对经常点击某条路线的用户进行限速,但前提是它们会导致某些例外。在Express中有一种自然的方法吗?

这里或多或少是我们现在所拥有的,而不受速率限制。

app.get(
    "/api/method", 
    authenticationMiddleware, 
    handler
);

速率限制中间件通常看起来像这样。它计算访问次数,如果用户访问了太多次,则会出错,甚至在我们到达处理程序之前都会出错。

app.get(
    "/api/method", 
    authenticationMiddleware, 
    rateLimiterMiddleware,   # <--- count, and tell them to go away if over limit
    handler
);

但是,我们可以让他们随意访问它们很多次-如果他们最近造成了很多异常,我们只是想禁止他们。

在Express中,错误处理程序应该位于处理程序链的末尾。

因此,似乎我们必须将“后卫”放在最前面,而将错误处理“计数器”放在最后。

app.get(
    "/api/method", 
    authenticationMiddleware, 
    errorIfTooManyExceptionsByUser,   # <--- tell them to go away if over the limit
    handler, 
    countExceptionsForUser            # <--- count
);

这似乎不太优雅,而且还有些棘手,因为限速中间件的两个部分必须彼此了解很多。有更好的方法吗?

也许我们可以变得更聪明并修改处理程序,以便在它们运行之前和之后进行防护和计数?

app.get(
   "/api/method", 
   authenticationMiddleware,
   rateLimitErrors(handler)   # <-- ???
)

我错过了什么吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您也许可以看看express-redis-cache如何处理他的中间件(https://github.com/rv-kip/express-redis-cache/blob/df4ed8e057a5b7d41d894e6e468f975aa62206f6/lib/ExpressRedisCache/route.js#L184)。他们使用自己的逻辑包装send()表达方法。也许与此相关,您只能拥有一个中间件,但我认为这不是最佳解决方案。

明确汇率限制

有一个现有的中间件可以处理快递https://www.npmjs.com/package/express-rate-limit中的速率限制。

Nginx处理

Express是一个轻量级的框架,他们在官方文档中建议将Nginx放在您的Express服务器前面以处理服务器内容。

  

https://expressjs.com/en/advanced/best-practice-performance.html

     

使用反向代理

     

反向代理位于Web应用程序的前面,除了将请求定向到应用程序之外,还对请求执行支持操作。它可以处理错误页面,压缩,缓存,服务文件和负载平衡等。

     

将不需要了解应用程序状态的任务移交给反向代理可以释放Express来执行专门的应用程序任务。因此,建议在生产环境中在Nginx或HAProxy之类的反向代理后面运行Express。

在nginx中,您有一个限速系统:https://www.nginx.com/blog/rate-limiting-nginx/。我不知道您是否可以针对您的特定用例自定义此功能,但我认为这是处理速率限制的最佳方法。