Discord.js斜杠命令报错:Cannot read property 'voice' of undefined
TypeError: Cannot read property 'voice' of undefined 问题解决方案
报错原因
该错误触发的核心是interaction.member返回了undefined,你尝试读取不存在对象的voice属性才会抛出异常。interaction.member不存在的常见场景有两个:
- 触发斜杠命令的场景是Discord私信(DM)频道,只有在服务器(Guild)内触发的交互才会携带
member属性,私信场景仅会携带user属性,不存在member字段 - 客户端连接网关时未开启必要的意图(Intent),导致服务器没有返回
member和语音状态相关的字段
解决方案
按以下顺序排查修复:
- 优先增加场景判断,过滤非服务器内的交互请求,同时使用可选链避免运行时报错
client.ws.on('INTERACTION_CREATE', async (interaction) => { // 新增校验逻辑 if (!interaction.guild_id || !interaction.member) { // 可根据业务需求返回对应的用户提示 return; } // 用可选链避免用户未加入语音频道时的二次报错 const memberVoice = interaction.member?.voice?.channel; if (!memberVoice) { // 可提示用户先加入语音频道后再执行命令 return; } // 原有业务逻辑 })
- 检查网关连接时的意图配置,必须开启以下两个核心意图才能拿到对应字段:
GUILD_MEMBERS(服务器成员相关权限)GUILD_VOICE_STATES(语音状态相关权限)
如果使用discord.js库,初始化配置参考如下:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildVoiceStates, // 其他业务需要的意图 ] });
如果是直接调用原生网关接口,需要在连接参数的intents字段中累加上述两个意图的枚举值。
内容的提问来源于stack exchange,提问作者Beatriz Mantoani
相关产品推荐
相关产品推荐

