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

discord.js v13使用joinVoiceChannel创建临时语音频道报错求助

问题根因

报错指向第11行的id属性读取失败,核心问题有两个:

  1. 传参逻辑不匹配:从调用栈可以看到命令是在messageCreate事件中触发的,该事件传递的是Message对象,但你代码中execute方法将参数命名为interaction,属于把斜杠命令的参数逻辑套用到了消息前缀命令上,如果你同时没有做属性兼容,就会出现空指针报错。
  2. 业务逻辑错误:joinVoiceChannel方法需要传入的是用户当前所在的语音频道ID,你代码中写的是触发命令的文本频道ID,文本频道本身不能作为语音连接的目标。

修复步骤

  • 调整参数命名和读取逻辑,适配messageCreate事件的传参结构
  • 增加前置校验,避免用户未加入语音频道、命令在私聊场景触发导致的空指针问题
  • 正确读取用户所在语音频道的ID作为入参

修正后代码

const { joinVoiceChannel } = require ('@discordjs/voice')

module.exports = {
  emoji: '🔈',
  name: 'voice',
  description: 'Create a temporary voice channel',
  execute(message) {
    // 禁止私聊使用该命令
    if (!message.guild) {
      return message.reply('该命令只能在服务器内使用');
    }
    // 校验用户是否已加入语音频道
    const memberVoiceState = message.member.voice;
    if (!memberVoiceState.channel) {
      return message.reply('你需要先加入一个语音频道才能使用该命令');
    }
    joinVoiceChannel({
      channelId: memberVoiceState.channel.id,
      guildId: message.guild.id,
      adapterCreator: message.guild.voiceAdapterCreator,
    })
  }
}

注意事项

  • 确保机器人已经被授予对应语音频道的连接、说话权限
  • 如果你后续要适配斜杠命令,需要单独编写交互事件的处理逻辑,不要和消息前缀命令混用参数读取代码
  • 开发环境需要开启GUILDS、GUILD_VOICE_STATES、GUILD_MESSAGES三个核心意图,否则会出现属性读取失败的问题

内容的提问来源于stack exchange,提问作者TomFirth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:36:02