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