2012-06-19 1 views
2

첫 번째 노드 js 앱을 만들고 싶습니다. 이를 위해 공개 트위터 짹짹과 출력 트윗을 요청 응답으로 가져와야합니다. 많이 찾았지만 이전 노드 버전 코드 (예 : createServer, addListener 같은 코드)로 작성된 코드가 있습니다. 트위터 호출을 요청하고 노드 버전 0.6.18에서 json을 응답으로 출력하는 코드는 어떻게 작성합니까?트위터 출력 방법 노드 js 버전 0.6.18을 사용하여 respose

다음은 내가

var http = require("http"); 
var events = require("events"); 
var port = 8001; 
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 + "/"); 

을 시도하고 오류가 일반적인 하나입니다 오류

$ node tweet.js 
Server running at http://localhost:8001/ 

timers.js:223 
    callback.apply(timer, args); 
      ^
TypeError: Cannot call method 'apply' of undefined 
    at Timer.ontimeout (timers.js:223:14) 
+0

** 무엇을 시도 했습니까? ** - 관련 코드를 찾았지만 작동하지 않았다고 암시했습니다. 그걸 제공 할 수 있니? 그리고 무엇이 실패 했는가? – Deestan

+1

이전 코드를 추가했습니다. 감사를 확인하십시오. – merahulpk

+0

타이머를 setInterval (getTweats(), 5000)으로 수정했습니다. 트윗의 첫 번째 세트는 콘솔에 출력됩니다. 그 후에 내가 언급 한 것과 같은 오류가 발생합니다. 따라서 기본적으로 짹짹을 가져 오는 코드가있는 것보다는 타이밍/콜백 문제로 보입니다. – almypal

답변

1

있어 기존의 코드입니다. 대신에 : 당신이 setIntervalgetTweats 기능 자체 전화를 원하기 때문에

setInterval(getTweats(), 1000); 

당신은

setInterval(getTweats, 1000); 

을이되어 있어야합니다.

코드에 괄호 대신 getTweats()이 있습니다. 이 getTweats을 먼저 호출하고 결과는에서 setInterval이됩니다. 이 결과는 undefined이므로 (함수가 아무 것도 반환하지 않음) 노드는 호출 할 수 없습니다.