NodeJS请求不返回

时间:2012-09-13 16:12:14

标签: http node.js twitter request asynccallback

对Node很新,我正在尝试将twitter流实现到我的node / express应用程序中。

此文件位于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);
    };

1 个答案:

答案 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

该文档说timeout if 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:)

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