警告:可能的 EventEmitter - 运行“foundation new"时的节点警告 [英] Warning: Possible EventEmitter - Node warning when running `foundation new`

查看:29
本文介绍了警告:可能的 EventEmitter - 运行“foundation new"时的节点警告的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每次我在 CLI 中运行 foundation new 以启动一个新的 Foundation 项目时,我都会收到一长串 Node 警告:

Every time I run foundation new in my CLI to start up a new Foundation Project I get a long list of Node warnings:

(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit
(node:15500) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit

节点号总是不同但警告和警告的数量总是相同的.我该如何解决这个问题?

The node number is always different but the warning and the number of warnings is always the same. How can I fix this?

显示这些警告后,其他一切似乎都运行良好,项目已创建.我不确定我是否应该担心这些警告.

After these warnings show, everything else seems to run fine and the project is created. I'm not sure if I should be worried about the warnings.

推荐答案

在关于 EventEmitter 内存泄漏 但在此处发布详细信息,因此此答案不是仅链接的答案.我不相信材料本身,只找到它并创建一个答案,以便 Stackoverflow 可以看到它.

Found this material on a blog post about EventEmitter memory leaks but posting the details here so this answer is not a link-only answer. I take no credit for the material itself, only finding it and creating an answer so it is visible to Stackoverflow.

在 node.js 和 io.js 中,您最终会看到以下错误消息:

In node.js and io.js, you'll eventually see this error message:

(节点)警告:检测到可能的 EventEmitter 内存泄漏.11个听众补充.使用emitter.setMaxListeners() 增加限制.

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

实际何时会发生泄漏?当您连续添加事件处理程序而不删除它们时,就会发生泄漏.当您多次使用单个发射器实例时,就会发生这种情况.让我们创建一个返回流中下一个值的函数:

When would a leak actually occur? A leak occurs when you continuously add event handlers without removing them. This particular happens when you use a single emitter instance numerous times. Let's make a function that returns the next value in a stream:

function next(stream) {
  // if the stream has data buffered, return that
  {
    let data = stream.read()
    if (data) return Promise.resolve(data)
  }

  // if the stream has already ended, return nothing
  if (!data.readable) return Promise.resolve(null)

  // wait for data
  return new Promise(function (resolve, reject) {
    stream.once('readable', () => resolve(stream.read()))
    stream.on('error', reject)
    stream.on('end', resolve)
  })
}

每次在流上调用 next() 时,都会在 readable、error 和 end 上添加一个处理程序.在第 11 次 next(stream) 调用时,您将收到错误消息:

Every time you call next() on stream, you add a handler on readable, error, and end. On the 11th next(stream) call, you'll get the error message:

(节点)警告:检测到可能的 EventEmitter 内存泄漏.添加了 11 个听众.使用emitter.setMaxListeners() 增加限制.

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

您不断向 error 和 end 添加处理程序,但尚未删除它们,即使数据已成功读取并且这些处理程序不再相关.

You've continuously added handlers to error and end, but have not removed them, even if data was successfully read and those handlers are no longer relevant.

清理处理程序的正确方法是确保在 promise 解决后,添加了 0 个事件处理程序:

The correct way to clean up your handlers is to make sure that after the promise resolves, a net of 0 event handlers are added:

return new Promise(function (resolve, reject) {
  stream.on('readable', onreadable)
  stream.on('error', onerror)
  stream.on('end', cleanup)

  // define all functions in scope
  // so they can be referenced by cleanup and vice-versa
  function onreadable() {
    cleanup()
    resolve(stream.read())
  }

  function onerror(err) {
    cleanup()
    reject(err)
  }

  function cleanup() {
    // remove all event listeners created in this promise
    stream.removeListener('readable', onreadable)
    stream.removeListener('error', onerror)
    stream.removeListener('end', cleanup)
  }
})

使用这种方法,不会有事件发射器泄漏,因为在每个 promise 解析后,净更改事件处理程序为 0.

With this method, there will be no event emitter leak as after every promise resolves, the net change events handlers is 0.

如果您希望在同一个发声体上有多个听众怎么办?例如,你可能有很多函数在监听同一个发射器:

What if you want multiple listeners on the same emitter? For example, you may have a lot of functions listening to the same emitter:

doThis1(stream)
doThis2(stream)
doThis3(stream)
doThis4(stream)
doThis5(stream)
doThis6(stream)
doThis7(stream)
doThis8(stream)
doThis9(stream)
doThis10(stream)
doThis11(stream)
doThis12(stream)
doThis13(stream)

如果上述所有函数都向数据事件添加处理程序,您将收到相同的泄漏错误消息,但您知道实际上并没有泄漏.此时,您应该相应地设置最大侦听器数量:

If all the functions above add handlers to the data event, you're going to get the same leak error message, but you know there isn't an actual leak. At this point, you should set the maximum number of listeners accordingly:

return new Promise(function (resolve, reject) {
  // increase the maximum number of listeners by 1
  // while this promise is in progress
  stream.setMaxListeners(stream.getMaxListeners() + 1)
  stream.on('readable', onreadable)
  stream.on('error', onerror)
  stream.on('end', cleanup)

  function onreadable() {
    cleanup()
    resolve(stream.read())
  }

  function onerror(err) {
    cleanup()
    reject(err)
  }

  function cleanup() {
    stream.removeListener('readable', onreadable)
    stream.removeListener('error', onerror)
    stream.removeListener('end', cleanup)
    // this promise is done, so we lower the maximum number of listeners
    stream.setMaxListeners(stream.getMaxListeners() - 1)
  }
})

这允许您确认限制并控制您的事件处理,同时允许 node.js 在发生实际泄漏时打印错误消息.

This allows you to acknowledge the limit and keep your event handling in control, while allowing node.js to print an error message if an actual leak occurred.

如果你只是简单的.setMaxListener(0),那么你可能在不知不觉中泄漏了.如果您看到任何使用 .setMaxListeners(0) 的代码(尤其是开源代码),请提出请求来修复它!不要走捷径!

If you simply .setMaxListener(0), then you may be unknowingly leaking. If you see any code (especially open source) that uses .setMaxListeners(0), make a pull request to fix it! Don't take shortcuts!

这篇关于警告:可能的 EventEmitter - 运行“foundation new"时的节点警告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆