在文档(https://github.com/fastify/fastify-rate-limit)中,您会发现 fastify.register(require('fastify-rate-limit') 中有不同的属性,例如 ,max,timeWindow,global 等)
fastify.register(require('fastify-rate-limit'), {
global : false, // default true
max: 3, // default 1000
ban: 2, // default null
timeWindow: 5000, // default 1000 * 60
cache: 10000, // default 5000
allowList: ['127.0.0.1'], // default []
redis: new Redis({ host: '127.0.0.1' }), // default null
skipOnError: true, // default false
keyGenerator: function(req) { /* ... */ }, // default (req) => req.raw.ip
errorResponseBuilder: function(req, context) { /* ... */},
enableDraftSpec: true, // default false. Uses IEFT draft header standard
addHeaders: {
// default show all the response headers when rate limit is reached
'x-ratelimit-limit': true,
'x-ratelimit-remaining': true,
'x-ratelimit-reset': true,
'retry-after': true
}
})
keyGenerator 属性是我需要修改以达到我想要的结果。
keyGenerator 生成一个密钥,然后用于唯一标识请求默认是最终用户的 IP 地址,但您可以更改它。
您可以使用请求对象的不同属性来修改此keyGenerator。
在我的例子中,我想通过 api 和 IP 地址唯一地识别一个请求。所以我根据IP地址和API名称生成了一个密钥,使用请求对象的两个属性如下所示。
req.raw.ip
req.raw.url
下面可以看到我为实现所需而编写的完整 sn-p。
fastify.register(require('fastify-rate-limit'),
{
keyGenerator (req) {
let requestUrl = req.raw.url;
requestUrl = requestUrl.split('/');
let apiName = requestUrl[requestUrl.length - 1].replace('/','');
return req.raw.ip+apiName },
max: 20,
timeWindow: 1000*30,
});
希望这对您有所帮助。