node.js - 请求 - 如何“emitter.setMaxListeners()”?

Posted

技术标签:

【中文标题】node.js - 请求 - 如何“emitter.setMaxListeners()”?【英文标题】:node.js - request - How to "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

【问题讨论】:

【参考方案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;

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

谢谢

【讨论】:

以上是关于node.js - 请求 - 如何“emitter.setMaxListeners()”?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js-Events 模块总结与源码解析

在 Node.js 中监听所有发出的事件

Node.js 的进程间和服务器间事件发射器/侦听器?

Node.js + Socket.io 内存泄漏和最大监听器

Node.js - 如何检查请求数据?

Node.js 如何响应升级请求?