2012-09-13 147 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地址:)

症状变成我的代理展示了一个非常多的等待时间,我以前没有预料到,因为我没有经历过在开发/测试时的问题。