DiscordJS v13 调用join指令时voice.channel信息不更新问题
问题根因与解决方案
- 检查机器人Intents配置
discord.js v13 必须主动启用GUILD_VOICE_STATESIntent才能接收实时语音频道状态更新,初始化Client时需要传入对应配置:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_VOICE_STATES, // 必须添加该项 // 其他你需要启用的Intent ] });
同时需要在Discord开发者后台的机器人管理页,开启Privileged Gateway Intents分类下的Server Members Intent和Voice State Intent开关,否则网关不会下发语音状态更新数据。
- 主动拉取最新成员数据规避缓存问题
如果Intent配置正确仍返回旧值,大概率是interaction.member读取了本地旧缓存,可主动拉取最新成员数据后再读取语音状态,修改execute内代码如下:
async execute(interaction) { // 拉取服务端最新成员数据 const freshMember = await interaction.guild.members.fetch(interaction.member.id); const voice = freshMember.voice; console.log(voice.channel); }
- 修正代码逻辑错误
你现有代码存在两处可优化的逻辑问题:
- if判断中错误使用赋值运算符
=而非相等判断===,会导致每次执行代码都会触发inUsed修改逻辑,需修正为:
const status = JSON.parse(fs.readFileSync('./commands/music/status.json', 'utf-8')); if(status.inUsed === true){ status.inUsed = false fs.writeFileSync( './commands/music/status.json', JSON.stringify(status,null,2)) }
- Node.js的
require机制会缓存JSON文件内容,直接用require('./status')会一直读到首次引入时的旧值,推荐改为用fs.readFileSync读取文件后解析JSON获取实时内容。
内容的提问来源于stack exchange,提问作者Siriusmart
相关产品推荐
相关产品推荐

