【问题标题】:Nodejs MaxListenersExceededWarningNodejs MaxListenersExceededWarning
【发布时间】:2018-10-01 10:16:53
【问题描述】:

我有一个错误,我不知道如何解决它。它只会发生几次。

错误信息:

(node:9140) MaxListenersExceededWarning: Possible EventEmitter memory leak detec
ted. 11 error listeners added. Use emitter.setMaxListeners() to increase limit

【问题讨论】:

  • 这没有提供足够的信息。添加您的 JS 代码和 package.json。正如消息所解释的,有一种方法可以通过增加限制来避免此警告,但首先您应该扫描代码以查看是否有任何不必要的侦听器附加到事件。
  • 我的 JS 代码太长,无法在此处发布,对于 package.json 也是如此
  • 好吧,没有它,就不可能对您面临的特定问题进行归零。只能提供一般准则。试试推荐here

标签: node.js express


【解决方案1】:

当您在代码中直接或间接使用EventEmitters 并且您在太短的时间内创建了太多而无法解决它们时,通常会发生此错误 - Node 将此检测为内存泄漏并引发错误一旦超过最大侦听器计数。

例如,在单元测试中通常会在每次测试之前和之后设置和拆除前置条件。像 Mocha 这样的测试运行器通常会并行运行测试。如果您有几十个测试,那么如果您的设置执行发出事件的操作(例如连接到数据库),您可以快速运行事件侦听器计数。

如果没有您的具体代码,就很难查明原因。我建议您查看您的代码,以查看您可能直接或在您包含的模块中使用的任何事件发射器,并查找您可能无意中并行创建太多事件发射器的任何实例(例如通过Promises或async)。关键是在代码中寻找有很多“并行执行”的地方,例如带有 Promises 的循环。 对于上下文,由于NodeJs Event Loop 的伪并行性质,并行执行 在这里用引号引起来。

默认情况下,Node 通常最多只允许 10 个监听器。您可以覆盖节点允许使用的发射器数量:

setMaxListeners(n);

但是,您应该知道这只是一个警告,它旨在帮助开发人员,当他们有可能导致内存泄漏的代码时发出警告。

【讨论】:

  • Jay,非常感谢您的回复,您很棒。老实说,问题仍然存在。前段时间我有同样的警告,它不会阻止任何块代码,他无缘无故地消失了。我不知道我能做什么,也许会再次消失。在您的回答中,您是对的,我对 DB 使用了很多 Promises 和异步查询。没有这些功能,我的代码将无法工作。不过,我会尽量减少这种情况并进行一些高级查询,以尽量减少总 Promise 的数量。
  • Hey Stepan,问题似乎来来去去没有原因的原因是由于 Promise 和异步代码在竞争条件下执行。如果你有几个承诺需要更长时间才能完成的事件发射器,那么最终会发生这种情况。如果您可以提供用于数据库连接的 npm 模块,我们应该能够查明发射器的原因。大多数数据库连接模块和 ORM 会针对连接打开、关闭和错误等事件发出事件。例如 redis 模块就是这样做的——npmjs.com/package/redis#api
  • 在 Node 中它的 process.setMaxListeners(n)
猜你喜欢
  • 2020-06-26
  • 2018-11-23
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多