【问题标题】:NodeJS Request not returningNodeJS请求不返回
【发布时间】:2012-09-06 19:00:45
【问题描述】:

Node 新手,我正在尝试在我的 node/express 应用程序中实现一个 twitter 流。

这个文件在我的路由文件夹中的一个单独的 stream.js 文件中,它是通过 ajax 从客户端 jquery 脚本调用的。

我查看并比较了其他几个站点上的 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);
    };

【问题讨论】:

  • 我没有看到问题,但我可以提供我的经验 - 直接使用内置的 http.request 对象是不值得的 - api太低级了许多可能出错的事情。使用npmjs.org/package/request 之类的请求库
  • 做到了,非常感谢。

标签: http node.js twitter request asynccallback


【解决方案1】:

我赞同史蒂夫的评论。如此多的 NodeJS 新手开发人员在巨头构建的非常低级的方法上破解了自己的道路。查看 NPM 上一些更常见的库。

考虑:https://github.com/joyent/node/wiki/modules 或:https://npmjs.org/

祝你好运!

【讨论】:

    【解决方案2】:

    哇。四年后。我也有类似的问题。

    同意史蒂夫的评论,也许是一个更好的库......,但这里是这个库的解决方案。好吧,不是完全是这个库,但这个概念应该也可以工作。

    问题

    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 访问它,而不是白名单请求的 ip :)

    症状变成了我的代理出现了我之前没有预料到的非常长的等待时间,因为我在开发/测试时没有遇到这个问题。

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多