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

使用discord.js获取Discord语音频道成员的缓存更新异常问题

解决Discord.js语音频道成员缓存不更新问题

你的问题根源在于channel.members读取的是Discord.js客户端本地缓存的成员数据,默认情况下客户端不会实时同步语音频道的成员变动,导致用户切换频道后仍返回旧缓存数据。以下是两种直接绕过缓存、获取最新成员数据的解决方案:

方案一:强制从API拉取频道及成员数据

在获取频道时添加{ force: true }参数跳过缓存,再主动拉取该频道的成员列表:

const execute = async (interaction, options) => {
  if (interaction.member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) {
    await interaction.deferReply({ ephemeral: true });
    const channelInput = options.getChannel('channel');
    // 强制从API获取最新频道数据,跳过本地缓存
    const channel = await interaction.member.guild.channels.fetch(channelInput.id, { force: true });
    // 主动拉取该频道的最新成员列表,更新缓存
    await channel.members.fetch();
    const members = channel.members.map(member => member.id);
    console.log(members);
  }
}

方案二:直接调用Discord REST API获取语音状态

彻底绕过客户端缓存,通过Discord官方API的语音状态端点获取数据,再筛选目标频道的成员:

const { Routes } = require('discord.js');

const execute = async (interaction, options) => {
  if (interaction.member.permissions.has(Permissions.FLAGS.MANAGE_GUILD)) {
    await interaction.deferReply({ ephemeral: true });
    const channelInput = options.getChannel('channel');
    const guildId = interaction.guild.id;
    
    // 直接调用API获取服务器所有语音状态数据
    const voiceStates = await interaction.client.rest.get(Routes.guildVoiceStates(guildId));
    // 筛选出目标频道的成员ID
    const members = voiceStates
      .filter(state => state.channel_id === channelInput.id)
      .map(state => state.user_id);
    
    console.log(members);
  }
}

补充说明

  • 原代码中await interaction.guild.members.fetch();是拉取整个服务器的成员缓存,完全没必要,建议删除以减少不必要的API请求。
  • 方案二更适合对实时性要求高的场景,完全不受客户端缓存机制影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:01:01