2012-09-13 105 views
1

對Node很新穎,我試圖在我的節點/快速應用中實現一個Twitter流。NodeJS請求不返回

此文件位於我的routes文件夾內的單獨的stream.js文件中,它通過客戶端jquery腳本中的ajax調用。

我看過並比較了其他幾個網站上的http.request,我嘗試了多種配置,但沒有任何內容。一切都達到http.request回調火,但我無法得到迴應

var http = require('http') 
     , events = require('events') 
     , url = require('url') 
     , fs = require('fs') 
     , path = require('path') 
     , sys = require('sys') 

     , tweet_emitter = new events.EventEmitter() 
     , options = { 
       host: "api.twitter.com", 
       port: 80, 
       path: "/1/statuses/public_timeline.json", 
       method: "GET" 
     } 

    var getTweets = function() { 
     console.log('getTweets');// fires fine 
     var req = http.request(options, function(res) { 
      console.log('STATUS: ' + res.statusCode);// nothing here executes 
      console.log('HEADERS: ' + JSON.stringify(res.headers)); 

      var data = ""; 

      res.setEncoding('utf8'); 
      res.on('data',function(chunk) { 
       data += chunk; 
       console.log(chunk); 
      }); 

      res.on('end',function() { 
       var tweets = JSON.parse(data); 
       if(tweets.length) tweet_emitter.emit('tweets', tweets) 
      }) 

      req.end() 
     }); 

     req.on('error', function(e) { 
      console.log('problem with request: ' + e.message); 
     }) 
    } 

    setInterval(getTweets, 5000); 

    exports.stream = function(req, res){ 
     var listener = tweet_emitter.addListener("tweets", function(tweets) { 
      res.writeHead(200, { "Content-Type" : "text/plain" }); 
      res.write(JSON.stringify(tweets)); 
      res.end(); 

      clearTimeout(timeout); 
     }); 

     var timeout = setTimeout(function() { 
      res.writeHead(200, { "Content-Type" : "text/plain" }); 
      res.write(JSON.stringify([])); 
      res.end(); 

      tweet_emitter.removeListener(listener); 
     },10000); 
    }; 
+4

我沒有看到問題,但我可以提供我的經驗 - 這是不值得直接與內置的http.request對象工作 - API太低級別太多,可以去的東西錯誤。使用請求庫,如https://npmjs.org/package/request –

+0

這樣做,真的很感激它。 –

回答

0

哇。四年後。我有類似的問題。

同意史蒂夫的評論,這可能是一個更好的圖書館......,但這裏是這個圖書館的解決方案。那麼,不是正好這個庫,但這個概念應該也一樣。

問題

const request = require('request'); 
var opts = {url:my_url,timeout:5000} 
request(opts,function(error,response,body){ 
    var data = parse(response); 
    dosomething(data); 
); 
// the callback is never called... 
// even after the timeout period... 

https://github.com/request/request

的醫生說大約是timeoutif the underlying TCP connection cannot be established, the OS-wide TCP connection timeout will overrule the timeout option (the default in Linux can be anywhere from 20-120 seconds).

也許我只是迫不及待120秒?嗯...

要強制超時我提出這個解決方案:

const request = require('request'); 
var opts = {url:my_url,timeout:5000} 
var complete = false 
request(opts,function(e,r,b){ 
    if(!complete) { 
    complete = true; 
    var d = parse(r); 
    dosomething(d); 
    } 
}); 

setTimeout(function() { 
    if(!complete) { 
    complete = true; 
    dosomething(null); 
    } 
}, opts.timeout); 

我的情況的根本原因可能是我的知識產權是應該被列入白名單,但我認爲它被列入黑名單和服務器根本沒有響應,甚至沒有發生錯誤。我能夠從一個不同的IP訪問它,只是不是白名單所要求的IP地址:)

症狀變成我的代理展示了一個非常多的等待時間,我以前沒有預料到,因爲我沒有經歷過在開發/測試時的問題。