1

Node は初めてで、Twitter ストリームをノード/エクスプレス アプリに実装しようとしています。

このファイルは、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

2 に答える 2

0

わお。4年後。私は同様の問題を抱えています。

おそらくより良いライブラリ...というSteveのコメントに同意しますが、これがこのライブラリの解決策です。正確にはこのライブラリではありませんが、コンセプトは同様に機能するはずです。

問題

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 に答える
0

私はスティーブのコメントに二度目です。非常に多くの初心者 NodeJS 開発者が、巨人によって構築された非常に低レベルのメソッドをハッキングしています。NPM で利用可能なより一般的なライブラリのいくつかを確認してください。

検討してください: https://github.com/joyent/node/wiki/modules または: https://npmjs.org/

頑張ってください!

于 2013-01-23T17:39:58.073 に答える