Discord.js音乐机器人出现错误

时间:2020-11-11 06:22:43

标签: javascript node.js discord discord.js

我的音乐机器人代码如下:
my code
运行正常,但播放5-6首歌曲后出现此错误:

:

,它将停止播放。我该如何解决 预先感谢!

1 个答案:

答案 0 :(得分:0)

我相信这部分代码(在execute方法中)是导致问题的原因:

try {
    var connection = await voiceChannel.join();
    queueContruct.connection = connection;
    play(message.guild, queueContruct.songs[0]);
  } catch (err) {
    console.log(err);
    queue.delete(message.guild.id);
    return message.channel.send(err);
  }

正在发生的是try块中发生错误。我不知道是什么原因导致该错误,它可能像是漫游器尝试加入语音通道时发生的错误。但是,当发生该错误时,将执行catch块,并且catch块将删除公会的队列,并尝试将错误作为消息发送。现在,这实际上会导致您遇到的两个错误。 play方法无法读取未定义的属性connection,因为它正在尝试执行serverQueue.connection,但是您的catch块已删除了serverQueue。 DiscordAPI错误(“无法发送空消息”)是尝试发送包含err对象的消息的结果,该对象是对象而不是字符串(从而导致Discord尝试发送空消息)。

要解决第一个问题,您可能需要更改几件事。首先,请确保使用try语句检查您的漫游器是否已在if块的语音通道(或它试图加入的语音通道)中。如果您的漫游器已经在语音通道中尝试加入该语音通道,则会发生错误,这将导致您的问题发生。其次,不要只是删除catch块中的队列。您可能应该使该漫游器首先离开它当前所在的语音通道,并结束当前行会中执行play方法的所有实例,以使该问题不再重演。要解决第二个问题,请尝试执行message.channel.send(err),而不要执行message.channel.send(err.stack)。这应该确保它是字符串,而不是作为消息发送到通道的对象。

您可能需要自己进行一些附加的调试才能在try块中查找实际上导致错误的原因。完成此操作后,您需要做的是即使在删除队列后也要阻止递归play方法继续起作用。如果可以对返回Promise的特定操作(例如加入语音通道)使用.catch()方法,则甚至可能完全避免使用try / catch(我不知道{{ 1}}返回一个Promise,但如果这样,您应该使用voiceChannel.join())。