Node.js:如何限制请求列表?

时间:2015-09-25 15:20:39

标签: node.js http-status-code-403 throttling node-async

我正在编写一个node.js应用程序,它需要从提供程序的页面列表中获取一些数据:

var list = [
  { url: 'http://www.example.com/1' },
  { url: 'http://www.example.com/2' },
  ...
  { url: 'http://www.example.com/N' },
];

目前我正在使用async.each,效果很好:

async.each(
  list, // 1st param is the array of items
  function(elem, callback) { // 2nd param is the function that each item is passed to
    request(elem.url, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body);
      }
    }),
  },
  function(err) { // 3rd param is the function to call when everything's done
    if (err) {
      console.error('Error in the final async callback:', err);
    }
  }
);

唯一的问题是,由于来自同一IP的请求过多,网站的服务器有时会(理解上)以 403 禁止的)状态代码进行响应在时间单位...

我看到async也提供了whilst()方法,其示例为:

var count = 0;
async.whilst(
  function () { return count < 5; },
  function (callback) {
    count++;
    setTimeout(callback, 1000);
  },
  function (err) {
    // 5 seconds have passed
  }
);

但是我没有看到如何使用它与列表一起使用,或者如何结合使用async.each ......: - (

所以答案是:如何限制(限制)node.js中的异步请求列表?

PS:为了更清楚,我不希望(如果可能的话)队列请求,因为请求可能需要很长时间才能完成。 。:我只是希望在定义的时间间隔内发起请求(比如每个请求之间的5~10秒......)。

更新

在alireza david评论之后,我确实尝试使用async.eachLimit,这看起来很有希望,对我来说......这是它的一个例子,在模块github上site

async.eachLimit(
    obj.files,
    limit
    function (file, complete) {
      complete();
    },
    function (err) {
    }
);

但限制使用没有记录,我不清楚...... 如果有人有任何线索......

1 个答案:

答案 0 :(得分:1)

大部分时间403意味着您应该限制您的请求,因为Web服务器认为您正在进行DDOS攻击。

在这种情况下,您应该async.eachLimit()

async.eachLimit(obj.files, 1000,
    function (file, complete) {
      complete();
    },
    function (err) {

    });

<强>更新 我认为,limit选项是并发请求的数量。 你应该减少这个数字(我的意见是2或3只是为了测试)