Discord.js音乐机器人队列结束后独自在频道时无法自动退出问题
问题原因
你的代码存在3个核心问题,导致退出逻辑永远无法触发:
- 提前执行return截断后续代码:第一个
if (queue.channel.members.size != 1)没有加花括号包裹分支逻辑,只有紧跟的message.client.queue.delete语句属于该判断分支,下一行的return无论判断结果是否成立都会执行,直接终止函数运行,后续的退出频道代码完全不会被调用 - 成员判断逻辑不严谨:直接用总成员数判断,没有过滤其他机器人账号,无法准确识别频道内是否存在真人听众
- 冗余重复判断:已经进入
if (!song)分支,后续再次判断if (!song)没有任何意义
修复后代码
const queue = message.client.queue.get(message.guild.id); if (!song) { const endembed = new MessageEmbed().setColor("#F0EAD6") .setAuthor(`Music Queue ended.`); // 过滤频道内的非机器人真人用户,统计数量 const realListenerCount = queue.channel.members.filter(member => !member.user.bot).size; if (realListenerCount === 0) { // 无真人听众,退出频道并清理队列 queue.channel.leave(); } // 无论是否退出,都清理当前队列 message.client.queue.delete(message.guild.id); // 统一发送队列结束提示 return queue.textChannel.send(endembed).catch(console.error); }
逻辑说明
- 优先统计频道内的真实听众数量,排除其他机器人的干扰,判断更准确
- 只有当没有真人听众时才执行退出频道操作,有真人时保持机器人在频道内等待新的播放请求
- 合并了重复的队列清理、消息发送逻辑,减少冗余代码
内容的提问来源于stack exchange,提问作者BlackDelta
相关产品推荐
相关产品推荐

