2011-01-08 66 views
3

我試着寫與node.js的一個簡單的應用程序,以從Twitter拉一些JSON ..節點JS Twitter的JSON

JSON加載好了第一次,但心不是越來越觸發了我的「推特」事件正確..

任何人都看到我要去哪裏錯了?任何意見非常感謝!


var twitterClient = http.createClient(80, 'api.twitter.com'); 
var tweetEmitter = new events.EventEmitter(); 
var request = twitterClient.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"}); 

function getTweats() { 

    request.addListener("response", function (response) { 
     var body = ""; 

     response.addListener("data", function (data) { 
      body += data; 
     }); 

     response.addListener("end", function (end) { 
      var tweets = JSON.parse(body); 
      if (tweets.length > 0) { 
       tweetEmitter.emit("tweets", tweets); 
       console.log(tweets, 'tweets loaded'); 
      } 
     }); 
    }); 

    request.end(); 
} 

setInterval(getTweats(), 1000); 


http.createServer(function (request, response) { 
    var uri = url.parse(request.url).pathname; 
    console.log(uri); 
    if (uri === '/stream') { 
     var cb = function (tweets) { 
      console.log('tweet'); // never happens! 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.write(JSON.stringify(tweets)); 
      response.end(); 
      clearTimeout(timeout); 
     }; 
     tweetEmitter.addListener("tweets", cb); 

     // timeout to kill requests that take longer than 10 secs 
     var timeout = setTimeout(function() { 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.write(JSON.stringify([])); 
      response.end(); 
      tweetEmitter.removeListener("tweets", cb); 
     }, 10000); 

    } else { 
     loadStaticFile(uri, response); 
    } 

}).listen(port); 

console.log("Server running at http://localhost:" + port + "/"); 

看到完整的文件@https://gist.github.com/770810

+0

固定;)工作代碼@ https://gist.github.com/770810 – zack

回答

4

您這裏有兩個問題:

  1. httpClient.request就是這樣,一個一次請求。
  2. 你不是傳遞函數getTweats的間隔,但其返回值
    setInterval(getTweats() */ <-- parenthesis execute the function */, 1000);

爲了解決這個問題,創建的getTweats每次調用一個新的請求:

function getTweats() { 
    // There's no need for request being global, just make it local to getTweats 
    var request = twitterClient.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"}); 

,正確傳遞函數setTimeout

setInterval(getTweats, 1000); 

PS:Thx for the gist!花了我15秒從那裏弄清楚,總是很棒,當人們發佈超過5行以外的代碼:)

+0

謝謝伊沃 - 現在工作:) ..不相信我掛斷了setInterval!在嘗試調試時,我在getTweets()之外移動了httpClient.request! – zack