2
我正在尝试处理维基百科文章,并且希望收到所有维基百科文章的列表。为了做到这一点,我经常发送http请求到维基百科API,它允许您在时间接收500个标题,并且还返回一个,继续字符串,在以下请求中使用该字符串时,将从该字符串开始返回标题。在Node.js中发送多个HTTP请求:未收到任何响应或超时
为了做到这一点,我使用的是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
事件。它似乎也被解雇的请求也失败了。我相应地修改了代码。
对不起,这不清楚。每次以500个标题出版,我的意思是我一次请求一个包含500个来自维基百科的标题的页面,而不是500个并发请求。 – Georg
您可以显示您用于处理和执行请求的实际代码吗? (我删除了我的旧评论,因为我不能再编辑它,它有一个错字) – robertklep
我现在更新了问题,显示了用于请求的代码。 – Georg