MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。 [客户端] 添加了 11 个 voiceStateUpdate 侦听器

MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 voiceStateUpdate listeners added to [Client]

我这里有这段代码可以检测机器人是否被踢出语音聊天。

const serverQueue = message.client.queue.get(message.guild.id);
const botvc = message.guild.me.voice.channel;
if (botvc === null) {
 if (serverQueue === undefined) {
  const queueConstruct = {
   connection: null,
   songs: [],
   volume: 2,
   playing: true,
  };
  message.client.queue.set(message.guild.id, queueConstruct);
  const newqueue = message.client.queue.get(message.guild.id);
  if (newqueue.songs[0] !== undefined) {
   newqueue.songs[0].looped = 0;
   message.client.queue.delete(message.guild.id);
  } else {
   message.client.queue.delete(message.guild.id);
  }
 } else {
  serverQueue.songs[0].looped = 0;
  serverQueue.songs = [];
  message.client.queue.delete(message.guild.id);
 }
}

这是 discord.js 中的一个 voicestateupdate 事件,在事件处理程序中。

代码有什么问题或者有什么可以修复内存泄漏的吗?

您的代码中可能有其他 voiceStateUpdate 个侦听器,或者您的代码不止一次添加侦听器(调用 client.on('voiceStateUpdate', listener))。警告(发生在所有 EventEmitter 上,而不仅仅是 Discord.js' Client)告诉您为一个事件添加过多的侦听器(默认值为 10)可能是一个错误。

调试时尝试在 client.on('voiceStateUpdate', ...) 上添加断点,以了解何时添加了侦听器。或者,尝试使用 --trace-warnings 标志查看内存泄漏警告的堆栈跟踪。

如果您确实需要 10 个以上的 voiceStateUpdate 听众(这不太可能),请使用 setMaxListeners 更改事件的最大听众数:

// Changes the maximum number of listeners for an event to 11
client.setMaxListeners(11)