You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:42:02