【问题标题】:Node.js fetching Twitter Streaming API - EADDRNOTAVAILNode.js 获取 Twitter 流 API - EADDRNOTAVAIL
【发布时间】:2012-09-02 05:36:22
【问题描述】:

我在 node.js 中编写了以下代码来访问 Twitter 流 API。如果我curl 下面的 URL,它可以工作。但是,我无法让它与我的代码一起使用。

var https = require('https');

https.request('https://USERNAME:PASSWORD@stream.twitter.com/1.1/statuses/sample.json', function(res) {
  res.on('data', function(chunk) {
    var d = JSON.parse(chunk);
    console.log(d);
  });
});

但我收到以下内容

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: connect EADDRNOTAVAIL
    at errnoException (net.js:642:11)
    at connect (net.js:525:18)
    at Socket.connect (net.js:589:5)
    at Object.<anonymous> (net.js:77:12)
    at new ClientRequest (http.js:1073:25)
    at Object.request (https.js:80:10)
    at Object.<anonymous> (/Users/jordan/Projects/twitter-stream/app.js:3:7)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:31)

如果有人可以提供替代解决方案,或者向我解释为什么这不起作用,我将非常感激。

【问题讨论】:

  • 您需要更改端口,它不可用... :)
  • @AmirAbuShareb 但 curl 对默认端口没有问题?我想我不确定我是否跟随。
  • 我可以在app.js 中看到10 行吗?
  • @AmirAbuShareb 抱歉,错误日志对应于旧版本的脚本。我已经更新了我原来的帖子,现在指向第 3 行。所有的代码都在那里。
  • 您能否监听request 可以发出的error 事件,看看在此错误之前是否发出任何错误...req.on('error', function () { console.dir(arguments); });

标签: node.js authentication twitter


【解决方案1】:

我最近遇到了同样的问题。这是解决方法

 var https = require('https');   
 var options = {   
   host : 'stream.twitter.com',   
   path : '/1.1/statuses/filter.json?track=bob',    
   method : 'GET',  
   headers : {   
   "Authorization": "Basic "+new Buffer("userName:passwd").toString("base64")
  }   
 };
 var request = https.request(options,function(response){   
   var body = '';
   response.on("data",function(chunk){    
    var tweet = JSON.parse(chunk);  
    console.log(tweet.text);  
  });  
 });  
 request.end();

【讨论】:

  • 这工作:) 谢谢。这种方法会错过任何推文吗?我觉得尝试解析一个块可能并不总是有效的 JSON 文档。
  • 一个人不能等待响应结束来解析数据,因为它是一个流式 API,而且收到的每个块都是有效的 json。所以我认为这不会是一个问题。
【解决方案2】:

https.request() 想要一个选项对象作为它的第一个参数,而不是字符串 URL。但是,您最好使用 mikeal 的请求库,它确实接受字符串 URL。

【讨论】:

    【解决方案3】:

    1) 如 ebohlman 所述,https.request 将选项对象作为第一个参数。

    http://nodejs.org/api/https.html#https_https_request_options_callback
    

    2) 您的 JSON.parse 很可能会失败,因为“数据”事件将在每个块上发出,并且响应可能跨越更多块,因此请等到响应结束。

    var data = ""
    res.on('data',function(chunk){
       data+=chunk
    })
    res.on('end',function(){
      try  {
         var parsed = JSON.parse(data)
      } catch(e) {
         console.log('failed to parse...',e)
      }
    })
    

    【讨论】:

    • 重点是它是一个流式API。我相信这些块放置适当,以便我可以解析每个块。
    【解决方案4】:

    请尝试通过killall node 杀死进程节点或执行ps -aux|grep node 并通过其ID 杀死进程。然后它将起作用。是的,如果您在Linux 上运行。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,问题是我使用的是旧版本的 Nodejs (v0.6.19),在那个版本中 http.get 需要第一个参数作为至少具有主机和路径属性的选项对象。在较新的版本中,您可以简单地给出 url 字符串。

      http.get({host:'www.google.com',path:'/index.html'}, function(res) {
        console.log("Got response: " + res.statusCode);
      }).on('error', function(e) {
        console.log("Got error: " + e.message);
      });
      

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 2014-12-17
        • 2013-04-05
        • 2015-04-18
        • 2014-12-17
        • 2014-02-15
        • 2019-09-23
        • 2016-07-06
        • 1970-01-01
        相关资源
        最近更新 更多