13

OS X 10.8.3

ノード 0.10.0

「http」モジュールを使用して、Facebook グラフ API のリクエストを作成しています。

「http.get」に渡すオプションは次のとおりです。

var options = {host: 'graph.facebook.com',
               port: 80,
               path: '/' + fb_id + '/picture'};  //fb_id is a Facebook user identifier

私のコードは次のようになります。

http.get(options,
  function(res) {
    ...some stuff...
    DONE(RESULT);  //DONE is a callback function
  }).on('error', function(e) {
       ...some error handling...
});

私が観察したことは、http.globalAgent.maxSockets の値と同じ数のリクエストしか実行できないということです。その数のリクエストに達すると、次の http.get への呼び出しは (明らかに) 接続しません。リクエストでエラーが発生していないことを確認しました。

応答が入った後、ソケットが閉じられていないようです。

ソケットが閉じていることを確認するために、応答ハンドラーの一部として何かする必要がありますか?

これらのソケットは、デフォルトのキープアライブ動作のために閉じていませんか?

これをデバッグするにはどうすればよいですか?

4

3 に答える 3

7

agent: falseオプションで設定してみてください。デフォルトの動作では、HTTP キープアライブのために接続を開いたままにします。

var options = {host: 'graph.facebook.com',
               port: 80,
               path: '/' + fb_id + '/picture',
               agent: false};
于 2013-04-09T18:50:11.687 に答える
2

Node の http モジュールは、エージェントのデフォルトがグローバル エージェントあると述べています。

ところで、2013 年 4 月 9 日の 20:47 の Wes のコメントへの応答: ノード モジュールをロードする回数は関係ありません。ノード モジュールは 1 回だけロードされ、すべてのモジュールで共有されます。

あなたが経験しているのは、プールの枯渇の問題です。これを回避する最も簡単な方法は、目的の maxSockets で新しいエージェント ( http://nodejs.org/api/http.html#http_class_http_agent ) を使用することです。作成したエージェントは、そのモジュールのエクスポートに配置すると、モジュール間で共有できることに注意してください (ノード内のモジュールはステートフルです!!!) 。

于 2014-03-24T15:49:02.017 に答える