您的要求被称为速率限制。实现起来可能非常复杂,也可能非常简单。使用express-rate-limit取得了成功。它是表示中间件的简单中间件。
类似这样将每个IP地址限制为每分钟100个请求。
const RateLimit = require( 'express-rate-limit' )
var limiter = new RateLimit(
{
windowMs: 1000 * 60,
max: 100,
headers: true,
onLimitReached: function( req, res, options ) {
console.log( 'Request rate limited for requests from ', req.ip )
}
} )
app.use( limiter )
但是对于商业设置而言,这太简单了,在商业设置中,您出售对API的访问权,并为高级客户提供了更高的限额。正如我提到的那样,设置起来很复杂。
在较高级别上,您需要为每个IP地址或user_id维护上次访问时间(或X次上次访问时间)的字典缓存。
然后,您将需要在每个页面请求周围使用包装函数,以更新上次访问时间,并检查它们是否在使用限制内。返回HTTP 429 - Too Many Requests
或调用破折号_.throttle()
或_.debounce()
函数。
但是,由于您不是第一个遇到此问题的人,因此事实证明有一个针对此问题的预写即插即用库: