在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参数。