1

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

该文件位于我的路由文件夹中的一个单独的 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

2 回答 2

0

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

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

祝你好运!

于 2013-01-23T17:39:58.073 回答
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 :)

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

于 2017-03-07T09:53:22.667 回答