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

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);
}
  • 修正代码逻辑错误
    你现有代码存在两处可优化的逻辑问题:
  1. 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))
}
  1. Node.js的require机制会缓存JSON文件内容,直接用require('./status')会一直读到首次引入时的旧值,推荐改为用fs.readFileSync读取文件后解析JSON获取实时内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:09:03