web-dev-qa-db-fra.com

node.js - request - Comment "emitter.setMaxListeners ()"?

Quand je fais un GET sur un certain URI en utilisant le module 'request' de node.js;

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

Le message d'erreur est:

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

et il y a aussi le message suivant:

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

Comment puis-je setMaxListeners?

36
camden_kid

Je conseille fortement de NE PAS utiliser le code:

process.setMaxListeners(0);

L'avertissement n'est pas là sans raison. La plupart du temps, c'est parce qu'il y a une erreur cachée dans votre code. La suppression de la limite supprime l'avertissement, mais pas sa cause, et vous empêche d'être averti d'une source de fuite de ressources.

Si vous atteignez la limite pour une raison légitime, mettez une valeur raisonnable dans la fonction (la valeur par défaut est 10).

De plus, pour modifier la valeur par défaut, il n'est pas nécessaire de jouer avec le prototype EventEmitter. vous pouvez définir la valeur de l'attribut defaultMaxListeners comme suit:

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

J'utilise le code pour augmenter globalement la limite par défaut: require('events').EventEmitter.prototype._maxListeners = 100;

30
zag2art

Voici comment j'ai résolu le problème:

Dans main.js du module 'request', j'ai ajouté une ligne:

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

Cela définit des écouteurs illimités http://nodejs.org/docs/v0.4.7/api/events.html#emitter.setMaxListeners

Dans mon code, j'ai défini explicitement la valeur 'maxRedirects':

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

Bien que l'ajout de quelque chose au module nodejs soit possible, cela ne semble pas être le meilleur moyen (si vous essayez d'exécuter votre code sur un autre ordinateur, le programme se bloquera avec la même erreur, évidemment).

Je préfère définir le nombre maximal d'écouteurs dans votre propre code:

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