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

discord.js v13 获取语音频道成员数据不更新如何解决?

discord.js v13 语音频道成员缓存不更新问题修复方案

问题原因

discord.js v13 版本要求显式声明网关意图,你遇到的成员数据不更新问题由两个原因导致:

  • 未开启GUILD_VOICE_STATES意图,客户端无法接收成员语音状态变更的事件通知,本地缓存永远停留在首次拉取的结果
  • 默认fetch方法优先读取本地缓存,没有主动拉取服务端最新数据

修复步骤

1. 补充网关意图

修改客户端初始化配置,新增GUILD_VOICE_STATES意图:

const { Client, Intents } = require('discord.js');
const client = new Client({
  intents: [
    Intents.FLAGS.GUILDS, // 基础频道相关意图必须开启
    Intents.FLAGS.GUILD_VOICE_STATES, // 语音状态同步专属意图
    // 其他你业务需要的意图可自行补充
  ]
});

2. 优化拉取逻辑,强制刷新缓存

修改频道和成员拉取逻辑,增加force: true参数跳过本地缓存,直接拉取服务端最新数据:

client.on('interactionCreate', async interaction => {
  if (!interaction.isCommand()) return;

  const { commandName } = interaction;

  switch (commandName) {
    case 'channels':
      const channelInput = interaction.options.getString('channelname');
      // 拉取全量频道时强制跳过缓存
      const allChannels = await interaction.guild.channels.fetch({ force: true });
      const channelExist = allChannels.find(channel => {
        return channel.name == channelInput && channel.isVoice()
      })
      
      if (!channelExist) {
        await interaction.reply('no voice channel');
        break;
      }
      // 强制拉取当前语音频道的最新成员列表
      await channelExist.members.fetch({ force: true });
      console.log(channelExist.members)
      console.log('===========')

      // 如果需要实现断开所有成员连接的需求,补充以下代码即可
      // channelExist.members.forEach(member => {
      //   member.voice.disconnect();
      // });
      // await interaction.reply(`已断开${channelExist.name}频道所有成员的语音连接`);
      break;
  }
});

额外注意事项

如果要实现断开成员连接的功能,需要确保机器人账号在对应服务器拥有移动成员(MOVE_MEMBERS)权限,否则操作会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:24:05