【问题标题】:node.js - request - How to "emitter.setMaxListeners()"?node.js - 请求 - 如何“emitter.setMaxListeners()”?
【发布时间】:2012-01-08 23:05:11
【问题描述】:

当我使用 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

【问题讨论】:

    标签: node.js httprequest


    【解决方案1】:

    我强烈建议不要使用该代码:

    process.setMaxListeners(0);
    

    警告不是无缘无故的。大多数时候,这是因为您的代码中隐藏了一个错误。删除限制会删除警告,但不会删除其原因,并防止您收到资源泄漏源的警告。

    如果您出于正当原因达到限制,请在函数中输入一个合理的值(默认值为 10)。

    另外,要更改默认值,没有必要弄乱 EventEmitter 原型。您可以像这样设置 defaultMaxListeners 属性的值:

    require('events').EventEmitter.defaultMaxListeners = 15;
    

    【讨论】:

    • 如何识别资源泄露原因?
    • 简而言之:调试。它们有很多可能导致资源泄漏的东西。并且有一些工具可以帮助检测它们。但他们并不是找到任何错误的神奇方法。
    • 你可以直接使用require('events').defaultMaxListeners = 15;
    • 在 react native 中使用它的位置
    • 我更强烈建议使用它:D
    【解决方案2】:

    我使用代码来增加全局默认限制: require('events').EventEmitter.prototype._maxListeners = 100;

    【讨论】:

    • 在运行 casperjs 脚本的 jenkins 中遇到了这个问题,在脚本顶部添加了这一行,它就可以工作了!。谢谢 var y = require('events').EventEmitter.prototype._maxListeners = 100;
    • 这对我不起作用。波纹管正在工作: require('events').defaultMaxListeners = 15;
    【解决方案3】:

    这就是我解决问题的方法:

    在“请求”模块的 main.js 中,我添加了一行:

    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};
    

    【讨论】:

    • 'Request' 是客户端请求。我对吗 ?你能详细说明一下吗?
    • @dev 是的,这是客户端请求。这是节点模块“请求”。
    • 添加了请求模块。现在我可以将该代码放在 http.createServer 的回调函数中吗?我试过了,但警告仍然存在。
    • process.setMaxListeners(0); // OMG, its so simple... :D
    • process.setMaxListeners(0);不能解决我的问题。节点版本:v9.4.0。而且,在 node_modules rt 中编辑代码不是一个好习惯吗?谁能告诉任何其他解决方案?
    【解决方案4】:

    虽然向 nodejs 模块添加一些东西是可能的,但这似乎不是最好的方法(如果你尝试在其他计算机上运行你的代码,程序显然会崩溃并出现同样的错误)。

    我宁愿在你自己的代码中设置最大监听数:

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

    【讨论】:

    • 这给出了request.setMaxListeners is not a function 错误。您必须将其链接到 request.get(…, function(){…}).setMaxListeners(0) (related ques)
    【解决方案5】:

    尝试使用:

    require('events').EventEmitter.defaultMaxListeners = Infinity; 
    

    【讨论】:

      【解决方案6】:

      这是@Félix Brunet answer 的扩展

      原因 - 您的应用中有代码隐藏

      如何找到 -

      • 剥离/注释代码并执行直到出现错误
      • 检查日志文件

      例如 - 在我的例子中,我创建了 30 个 winston log Unknowingly 实例,它开始出现错误

      注意:如果你抑制了这个错误,它会在 3..4 天后再次出现

      【讨论】:

        【解决方案7】:

        我也遇到过这种情况

        我使用了这段代码,它成功了

        require('events').EventEmitter.defaultMaxListeners = infinity;
        

        试试看。它可能会有所帮助

        谢谢

        【讨论】:

          猜你喜欢
          • 2012-08-22
          • 1970-01-01
          • 2017-10-31
          • 2017-02-23
          • 2012-06-17
          • 2017-09-25
          • 2013-08-05
          • 2011-12-10
          • 2013-12-24
          相关资源
          最近更新 更多