如何使用 express-rate-limit 设置 X-RateLimit-Reset?

How to set X-RateLimit-Reset with express-rate-limit?

我想设置用户在达到速率限制时必须等待的自定义时间。我正在使用 express-rate-limit and thought I could do this by setting a custom X-RateLimit-Reset in the handler。我可以设置这个值,但似乎没有任何效果。

作为一个极端的例子,我试图在我的处理程序中使用以下内容在未来很长一段时间内阻止它们:

res.setHeader('X-RateLimit-Reset', Date.now() + 100000000000)

控制台日志记录 res 之后结果正确:

 'x-ratelimit-reset': [ 'X-RateLimit-Reset', 1566112162159 ] // <-- far in the future

但是,在这样做之后,用户仍然可以调用应该被速率限制的函数。如何为用户设置自定义重置时间?

首先,由于您没有提及,我假设您使用的是 express-rate-limit 附带的默认 MemoryStore。因此,要回答您的问题,您不必在响应中手动设置 x-ratelimit-reset header,程序包会为您完成。

  • 因此,如果您使用默认的 MemoryStore,则配置如下所示,
app.use(
    RateLimit({
        windowMs: 10 * 60 * 1000 , // 10 minutes
        max: 100, // limit each IP to 100 requests per windowMs
        message: 'You have exceeded the 100 requests in 10 minutes limit!',
    })
);
  • 而且,如果您使用的不是默认商店,您可以在其中添加商店配置,
app.use(
    RateLimit({
        store: new MongoStore({
            uri: 'mongodb://localhost:27017/your-db-name',
            expireTimeMs: 10 * 60 * 1000 // 10 minutes
        }),
        windowMs: 10 * 60 * 1000 , // 10 minutes
        max: 100, // limit each IP to 100 requests per windowMs
        message: 'You have exceeded the 100 requests in 10 minutes limit!',
    })
);

请注意,rate-limt-redis 商店在 x-ratelimit-reset header 方面存在一些问题,无法按预期工作。所以,您可以继续其他选择。