discord.js v13使用joinVoiceChannel创建临时语音频道报错求助
问题根因
报错指向第11行的id属性读取失败,核心问题有两个:
- 传参逻辑不匹配:从调用栈可以看到命令是在
messageCreate事件中触发的,该事件传递的是Message对象,但你代码中execute方法将参数命名为interaction,属于把斜杠命令的参数逻辑套用到了消息前缀命令上,如果你同时没有做属性兼容,就会出现空指针报错。 - 业务逻辑错误:
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
相关产品推荐
相关产品推荐

