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

