使用discord.js依据userID断开用户语音连接的实现问题
错误原因
你传入的userID是字符串类型的用户标识,并非discord.js封装的GuildMember实例对象,本身不存在VoiceState属性与对应方法,调用时自然会抛出未定义读取错误。
正确实现(适用discord.js v14版本)
前置要求
- 机器人账号已被授予目标服务器的
Move Members权限 - 你需要先拿到目标用户所在服务器的
Guild实例对象
完整代码
async function disconnectUser(guild, userID) { // 从服务器实例中拉取对应成员对象 const targetMember = await guild.members.fetch(userID).catch(() => null); if (!targetMember) return console.error('未找到对应用户'); // 校验用户是否处于语音频道中 if (!targetMember.voice.channel) return console.error('目标用户当前未加入任何语音频道'); // 执行断开操作 await targetMember.voice.disconnect(); return; }
调用示例
你可以在指令事件回调中通过interaction对象获取所在服务器实例,传入函数即可:
// 示例:斜杠指令触发时调用 client.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return; if (interaction.commandName === '断开用户') { const targetUserID = interaction.options.getString('用户id'); await disconnectUser(interaction.guild, targetUserID); await interaction.reply('操作已执行'); } });
注意事项
- 该函数为异步函数,调用时需要添加
await关键字避免异步时序问题 - 如果目标用户和机器人不在同一个语音频道,只要机器人有
Move Members权限依然可以完成断开操作
内容的提问来源于stack exchange,提问作者jimhub
相关产品推荐
相关产品推荐

