2012-01-20 22 views
0

我需要在週期內創建http.get請求到google api緩存服務。隨着我的NodeJS嘗試做我如何在http.get中運行週期

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) 
+0

首先,你爲什麼會做這樣的事情。 http.get一個循環到41923?!糟糕的主意...... 無論如何,這似乎是一個json解析錯誤,檢查字符串,谷歌響應,如果它是有效的或不 – moe

+0

如果不得不提及,你擴展你的身體與每個週期。在進入http.get – moe

+0

之前清除你的responseBody,將我的代碼改爲for(var i = 41924,postID = i; i <= 41925; i ++){response} =''; 但仍然是相同的錯誤。 –

回答

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/檢查,但它不會因爲顯而易見的原因工作。我希望它能幫助你完成你的項目。

請讓我知道你是否需要更多。

最佳, 馬立克

+0

對於循環來說沒有問題,問題是,您必須處理正確的內容。問題在於JSON解析器,這意味着傳遞的字符串有問題。 使用on.data只有有意義,如果你可以用特殊的方式處理這些塊,on.end在這裏應該足夠了 – moe

+0

謝謝@Marek,它幫助我們看到正確的方式! –

相關問題