web-dev-qa-db-ja.com

node.js-リクエスト-「emitter.setMaxListeners()」の方法

Node.js 'request'モジュールを使用して特定のURIでGETを実行すると、

var options = {uri:"aURI", headers:headerData};
request.get(options, function (error, response, body) {
}

エラーメッセージは:

[Error: Exceeded maxRedirects. Probably stuck in a redirect loop.]

そして次のメッセージもあります:

"(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit."

setMaxListenersどうすればいいですか?

36
camden_kid

コードを使用しないことを強くお勧めします。

process.setMaxListeners(0);

警告は理由なくそこにありません。ほとんどの場合、コードにエラーが隠されているためです。制限を削除すると、警告は削除されますが、その原因は削除されず、リソースリークの原因について警告されなくなります。

正当な理由で制限に達した場合は、関数に適切な値を入れてください(デフォルトは10です)。

また、デフォルトを変更するために、EventEmitterプロトタイプをいじる必要はありません。 defaultMaxListeners属性の値は次のように設定できます。

require('events').EventEmitter.defaultMaxListeners = 15;
48
Félix Brunet

コードを使用して、デフォルトの制限をグローバルに増やします:require('events').EventEmitter.prototype._maxListeners = 100;

30
zag2art

これは私が問題を解決した方法です:

「request」モジュールのmain.jsに1行追加しました。

Request.prototype.request = function () {
  var self = this
  self.setMaxListeners(0); // Added line

これは無制限のリスナーを定義します http://nodejs.org/docs/v0.4.7/api/events.html#emitter.setMaxListeners

私のコードでは、「maxRedirects」値を明示的に設定しました。

var options = {uri:headingUri, headers:headerData, maxRedirects:100};
7
camden_kid

Nodejsモジュールに何かを追加することは可能ですが、最善の方法ではないようです(他のコンピューターでコードを実行しようとすると、明らかに同じエラーでプログラムがクラッシュします)。

私はむしろあなた自身のコードで最大リスナー数を設定したい:

var options = {uri:headingUri, headers:headerData, maxRedirects:100};
request.setMaxListeners(0);
request.get(options, function (error, response, body) {
}
7
Mariya Davydova