Nodejs Http请求没有响应

时间:2015-03-06 00:38:18

标签: node.js http get response

目前正在将http GET用于外部API。单独调用时,响应很好。当进入for循环时,一些请求似乎没有响应。

这是http GET功能:

function httpGetChunk(url, callback) {
    http.get(url, function(resp) {
        var body='';
        resp.on('data', function(chunk) {
            body += chunk; //chunk too large from this response
        });
        resp.on('end', function() {
            var data = JSON.parse(body);
            callback(data);
        });
        resp.on("error", function(e) {
            console.log("Got error: " + e.message);
        });
    });
}

当我在for循环中为5个不同的URL调用GET函数时,我只得到其中一些的响应。跑几次,响应将来自被叫网址的不同组合,但绝不是全部。

有什么见解?

修改1:为了提供更多信息,我的for循环看起来像这样。

for (var i=0;i<5; i++) {
    httpGetChunk(someUrl, function(data) {
        console.log(data);
    });
}

这只会打印出一些回复,但不是全部。

编辑2: 我已经考虑了这个帖子的所有建议。我现在正在使用异步模块并将并发连接数增加到20:

http.globalAgent.maxSockets = 20;

以下代码是我目前正在测试的代码:

getMatchStats()返回游戏&#39;匹配&#39;统计对象(例如杀人,比赛中的死亡等)

matchIds是包含匹配项

的所有id键的数组
async.parallel([
    getMatchStats(matchIds[0], function (matchData) {
        console.log('0');
    }),
    getMatchStats(matchIds[1], function (matchData) {
        console.log('1');
    }),
    getMatchStats(matchIds[2], function (matchData) {
        console.log('2');
    }),
    getMatchStats(matchIds[3], function (matchData) {
        console.log('3');
    }),
    getMatchStats(matchIds[4], function (matchData) {
        console.log('4');
    }),
], function(err, result) {
    console.log('done');
    callback(result);
});

和getMatchStats

function getMatchStats(matchId, callback) {
    var url = getMatchStatsUrl(matchId); //gets url based on id
    httpGetChunk(url, function(data) {
        callback(data);
    });
}

再次,async.parallel永远不会完成,因为只有一些请求有响应。每次我运行它时,响应都来自不同的匹配组合。有时,它甚至会完成所有请求。

也许我的操作系统对连接数有限制(我在localhost上进行测试)?

1 个答案:

答案 0 :(得分:1)

每个请求都是异步的。因此,如果使用常规for循环,则每个步骤将同步执行,并且不会等待回调被调用。您需要的是像each模块中的async方法,例如:

async.each(yourArrayOfUrls, function (url, callback) {
  httpGetChunk(url, function(data) {
    console.log(data);
    callback();
  });
}, function (err) {
  // if some step produce an error, you can get it here...
});