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()”?的主要内容,如果未能解决你的问题,请参考以下文章