node.js - 在 Node.js 中发送多个 HTTP 请求 : Not receiving any responses or timeouts

标签 node.js http mediawiki keep-alive wikipedia-api

我正在尝试处理维基百科文章,并希望收到所有维基百科文章的列表。为了做到这一点,我经常向维基百科 API 发送 http 请求,它允许您一次接收 500 个标题并返回一个 apcontinue 字符串,当在以下请求中使用时,返回标题从那个字符串开始。

为了做到这一点,我使用了 agentkeepalive 模块:

var http = require('http');
var Agent = require('agentkeepalive');

var keepaliveAgent = new Agent({
  keepAlive: true,
  maxSockets: 5,
  timeout: 5000,
  keepAliveTimeout: 3000
});

要向维基百科发送 http 请求,我使用以下代码:

function wikipediaApiCall(params, callback) {
  var options = {
    host: 'en.wikipedia.org',
    path: '/w/api.php?' + createParamString(params),
    method: 'GET',
    agent: keepaliveAgent
  };

  var callbackFunc = function(response) {
    var err;
    var str = '';

    if (('' + response.statusCode).match(/^5\d\d$/)) {
      err = new Error('Server error');
    }

    //another chunk of data has been recieved, so append it to `str`
    response.on('data', function (chunk) {
      str += chunk;
    });

    response.on('error', function (e) {
      err = new Error('Request error');
    });

    response.on('timeout', function () {
      err = new Error('Timeout');
      response.abort();
      callback(err);
    });

    response.on('end', function () {
      var obj = JSON.parse(str);

      if (obj.warnings) {
        err = new Error('Request error');
      }

      callback(err, obj);
    });
  }

  var req = http.request(options, callbackFunc);
  req.setTimeout(5000);

  req.on('error', function(err) {
    callback(err, null);
    return;
  });

  req.on('timeout', function () {
    err = new Error('Timeout');
    response.abort();
    callback(err);
  });

  req.on('finish', function(){
    console.log('ended');
  });

  req.end();
}

但是,在发送 16 到 20 个请求后,我没有收到任何响应,但我的请求也没有超时。

知道为什么会这样吗?

更新

我发送给维基百科的请求包含以下参数:

  var params = {
    list: 'allpages',
    aplimit: limit,
    apfrom: from,
    continue: cont,
    // apfilterredir: 'nonredirects'
  };

有趣的是,在省略 nonredirects 设置后,我最多可以发送和接收 330 个请求,但仅此而已。

更新 2

我能够注册一个finished 事件。它似乎也因失败的请求而被解雇。我相应地修改了代码。

最佳答案

也许您需要一个机器人标记来获得更高的 API 限制。也许并行的请求太多了; WMF 建议在这种大任务的情况下连续发出请求。此外,根据 WMF API 礼仪,您应该使用低值的 maxlag 参数。

关于node.js - 在 Node.js 中发送多个 HTTP 请求 : Not receiving any responses or timeouts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685079/

相关文章:

javascript - 在 Mediawiki 中显示 "Real Name"而不是用户名

node.js - Mongoose:如何建模对象层次结构?

node.js - 使用 socket.io-stream 将文件从服务器流式传输到客户端

ruby - Ruby 中的简单 HTTP 服务器

javascript - 在用户的浏览器上缓存 JavaScript 和 CSS,并在进行更改时加载新的

php - MediaWiki 文本表如何连接到类别表?

mediawiki - wikitravel - 如何获取图片链接

javascript - 对nodejs版本和javascript版本感到困惑

javascript - 如何将 Canvas 状态保存到数据库?

php - Laravel 8 - 不支持的授权类型