使用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
相关产品推荐
相关产品推荐

