开发Discord音乐机器人:检查用户与机器人同频道时遇TypeError报错
解决Discord音乐机器人语音频道校验错误
错误原因
你碰到的TypeError: Cannot read properties of undefined (reading 'find'),核心问题在于:
- 新版discord.js(v14+)中
client.voice.connections的结构已变更,直接调用find方法会触发未定义报错; - 全局遍历所有语音连接的方式既低效又容易出错,应该针对当前服务器(Guild)定位机器人的语音状态。
正确实现代码
要实现“仅允许同频道用户执行跳过歌曲等操作”的需求,用以下代码替代原有逻辑:
// 先检查用户是否在语音频道 if (!interaction.member.voice.channel) { return interaction.reply('❌ 请先加入一个语音频道!'); } // 获取机器人在当前服务器的语音频道 const botVoiceChannel = interaction.guild.members.me.voice.channel; // 校验机器人是否在频道,且和用户同频道 if (!botVoiceChannel || botVoiceChannel.id !== interaction.member.voice.channel.id) { return interaction.reply('❌ 你必须和机器人处于同一个语音频道才能执行此操作!'); } // 后续的跳过歌曲等操作代码...
如果使用的是discord-player v6+版本,也可以通过队列实例直接校验:
const queue = player.getQueue(interaction.guildId); if (!queue || queue.connection.channel.id !== interaction.member.voice.channel.id) { return interaction.reply('❌ 你必须和机器人处于同一个语音频道才能执行此操作!'); }
代码说明
- 先校验用户的语音状态,避免后续读取
voice.channel时出现未定义错误; - 通过
interaction.guild锁定当前服务器,只检查该服务器内机器人的语音频道,逻辑更精准; - 双重校验确保机器人处于语音频道,且与用户频道一致,符合你的需求。
内容的提问来源于stack exchange,提问作者BabaYagaPROP
相关产品推荐
相关产品推荐

