在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) # <-- ???
)
我错过了什么吗?或者有更好的方法吗?
答案 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中的速率限制。
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/。我不知道您是否可以针对您的特定用例自定义此功能,但我认为这是处理速率限制的最佳方法。