2011-01-08 13 views
3

Ich versuche, eine einfache Anwendung, mit node.js zu schreiben einige json von Twitter zu ziehen ..node-js twitter json

json Lasten ok das erste Mal, aber meine Veranstaltung ‚Tweets‘ isnt immer ausgelöst richtig ..

jemand sehen, wo ich falsch liege? Jeder Rat wird sehr geschätzt!


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 + "/"); 

siehe vollständige Datei @https://gist.github.com/770810

+0

behoben;) Arbeitscode @ https://gist.github.com/770810 – zack

Antwort

4

Sie haben zwei Probleme:

  1. httpClient.request nur das heißt, eine einmal Anfrage.
  2. Sie vorbei nicht die Funktion getTweats auf das Intervall, aber sein Rückgabewert:
    setInterval(getTweats() */ <-- parenthesis execute the function */, 1000);

Um es zu beheben, erstellen Sie eine neue Anforderung für jeden Aufruf von 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"}); 

und führen Sie die Funktion korrekt setTimeout:

setInterval(getTweats, 1000); 

PS: Thx für das Wesentliche! Nahm mich wie 15 Sekunden, um es von dort herauszufinden, immer toll, wenn Leute mehr als nur 5 Zeilen außerhalb des Kontexts Code schreiben :)

+0

Danke Ivo - arbeitet jetzt :) ..cant glaube ich habe auf setInterval aufgehängt! ..Ich habe die httpClient.request außerhalb von getTweets() verschoben, während ich versuche zu debuggen! – zack