答案 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()
)。