如何在 node.js 中使用 'limiter'

How to use 'limiter' in node.js

我正在尝试在我的应用程序中实施一些反垃圾邮件机制。我遇到了 the limiter package.

看完他们的例子我很困惑:

var RateLimiter = require('limiter').RateLimiter;
var limiter = new RateLimiter(150, 'hour', true);  // fire CB immediately

// Immediately send 429 header to client when rate limiting is in effect
limiter.removeTokens(1, function(err, remainingRequests) {
  if (remainingRequests < 1) {
    response.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
    response.end('429 Too Many Requests - your IP is being rate limited');
  } else {
    callMyMessageSendingFunction(...);
  }
});

'response'在哪里定义的?我们不需要使用 app.use() 将限制器连接到路径吗?否则限制器如何知道传入 IP?

几天前我试过这个包。该包用于记录一段时间内的请求次数。请求来自哪里并不重要。所以这个包不关心传入的 IP 地址是什么。

确实需要在application中间件中添加代码来限制整个应用或者一个route中间件对于指定的路线。然后就可以得到response对象。下面是一个简单的用法。

var express = require('express')
var app = express()

app.use(function (req, response, next) {
  limiter.removeTokens(1, function(err, remainingRequests) {
      if (remainingRequests < 1) {
        response.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
        response.end('429 Too Many Requests - your IP is being rate limited');
      } else {
        next();
      }
    });
})

如果要跟踪指定的IP地址。我推荐 express-rate-limit and express-limiter