我如何在循环中使用http.get操作

时间:2012-01-20 20:00:36

标签: http node.js

我需要在循环中创建http.get请求到google api |缓存服务。使用nodejs我尝试这样做

for(var i = 41923,postID=i; i <= 41925; i++) {

    http.get(options, function(res) {
                res.setEncoding('utf8');
                res.on('data', function(data) {
                    responseBody += data;
                }).on('end', function() {
                    if(getPostCacheUrl) {
                        var json = JSON.parse(responseBody);
                        json.items = json.items || [];
                        var cacheUrl = getPostCacheUrl(json);
                        parseCacheUrl(cacheUrl);
                    }
                }).on('error', function(error) {
                    console.log('ERROR' + error.message);
                });

    });
}

但是我发现了错误:

undefined:1
: 200}{"response
      ^
SyntaxError: Unexpected token {
    at Object.parse (native)
    at IncomingMessage.<anonymous> (/Users/macbookpro/Sites/googlecache/title.js:30:41)
    at IncomingMessage.emit (events.js:88:20)
    at HTTPParser.onMessageComplete (http.js:137:23)
    at Socket.ondata (http.js:1137:24)
    at TCP.onread (net.js:354:27)

1 个答案:

答案 0 :(得分:2)

首先,看起来你没有得到任何数据......在行

}).on('end', function() {

应该有一个处理程序从中获取响应并解析它,例如:

}).on('end', function(responseBody) {

添加console.log(responseBody)来检查它是否是一个对象,我不记得这里传递了什么。

我不会问为什么你需要从谷歌请求这么多数据(注意禁令或反垃圾邮件行动);)

我在这里看到的另一个问题可能是异步请求。请尝试以下,如果有帮助请告诉我。它会在发送下一个请求之前等待请求完成。我猜这就是问题所在。

function getSomething(i) {
    // make sure that i is int
    i = parseInt(i);

    console.log('Getting something: ' + i);

    // put the i somewhere if needed... not sure what you need...

    // break if out of the scope
    if (i < 41923 || i > 41925) return;

    http.get(options, function(res) {
                res.setEncoding('utf8');
                res.on('data', function(data) {
                    responseBody += data;
                }).on('end', function(responseBody) {
                    // Do console.log(responseBody) to check how the response looks, it is probably object - pass data from it to JSON.parse()
                    // Not sure what is this var getPostCacheUrl
                    if(getPostCacheUrl) {
                        var json = JSON.parse(responseBody);
                        json.items = json.items || [];
                        var cacheUrl = getPostCacheUrl(json);
                        parseCacheUrl(cacheUrl);
                    }
                    console.log('Getting something: success - triggering next get!');
                    getSomething(i + 1);
                }).on('error', function(error) {
                    console.log('ERROR' + error.message);
                    // If you need to go on even if there is an error add below line
                    //getSomething(i + 1);
                });
                // I would suggest to check timeout even as well    
    });
}
getSomething(41923);

可以在此处检查示例http://jsfiddle.net/Pu3cr/2/,但由于显而易见的原因,它不起作用。我希望它能帮助你完成你的项目。

如果您还需要更多信息,请与我们联系。

最佳, 马立克