discord.js获取指定角色所有成员仅返回1人问题求助
问题根因
- 未开启Discord Bot的
Server Members特权网关意图,Discord API默认不会推送全量服务器成员数据到Bot本地缓存,当前你本地缓存中仅保留了1名近期和Bot产生过交互的持有目标角色的成员,因此查询仅返回1条结果。 - 直接读取
roles.cache本地缓存数据,未主动调用接口拉取全量持有目标角色的成员列表。
修复步骤
- 开启特权意图
进入Discord开发者平台的Bot应用管理页,切换到「Bot」标签页,下滑到Privileged Gateway Intents区域,打开
Server Members Intent开关后保存设置。
- 初始化Client时声明成员意图
在创建Bot Client实例时,明确加入GuildMembers意图,示例代码如下(discord.js v14版本):
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, // 必须添加该意图才可获取全量成员数据 // 其他业务需要的网关意图可自行补充 ] });
- 修改查询代码,主动拉取全量成员数据
不要直接读取本地缓存,先调用拉取接口获取全量数据后再处理:
const CSCid = "496507412300300288"; // 先拉取目标角色的全量数据 const targetRole = await interaction.guild.roles.fetch(CSCid); // 主动拉取所有持有该角色的成员到本地缓存 await targetRole.members.fetch(); // 此时再遍历成员就能拿到完整列表 const CSCmembers = targetRole.members.map(m => m.user.tag); console.log(CSCmembers);
注意:上述代码使用了
await语法,需要放在async标记的函数内才能正常运行,interaction的响应回调函数本身默认支持async语法,直接修改即可。
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

