在Node.js中发送多个HTTP请求:没有收到任何响应或超时

我正在处理维基百科文章,并希望收到所有维基百科文章的列表。 为了做到这一点,我经常发送http请求到维基百科API,它允许你在时间接收500个标题,并且还返回一个apcontinuestring,当在下面的请求中使用时,将返回从该string开始的标题。

为了做到这一点,我使用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了非nonredirects设置之后,我能够发送和接收多达330个请求,但不超过这个要求。

更新2

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

也许你需要一个bot标志来具有更高的API限制。 也许有太多的请求并行; WMF的build议是在这样大的任务情况下连续发出请求。 此外,您应该使用WMF API礼仪的低值maxlag参数。