如何在Discord.js中将拥有指定角色的所有用户存入数组
问题原因
- 缺少
GUILD_MEMBERS网关权限:Discord.js v12及以上版本默认不开启全服成员拉取权限,你需要同时在Discord开发者后台的Bot设置页开启Server Members Intent特权意图,且在初始化客户端时声明该意图,否则Bot只能拉取到已进入本地缓存的少量成员(比如自身、近期发过消息的用户),就会出现仅返回1个用户的情况。 - 本地缓存未同步:即使开启了权限,刚启动的Bot本地成员缓存可能未拉取全量数据,直接从缓存读取角色关联成员也会缺漏。
修复步骤
开启后台特权意图
进入Discord Developer Portal的对应Bot应用页,找到「Bot」设置栏,下拉到「Privileged Gateway Intents」区域,开启Server Members Intent开关并保存。客户端初始化声明对应意图
根据你使用的Discord.js版本调整初始化代码,示例为v14版本:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 基础服务器意图必须开启 GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, GatewayIntentBits.GuildMembers // 新增成员拉取意图 ] });
v13版本将GatewayIntentBits.GuildMembers替换为Intents.FLAGS.GUILD_MEMBERS即可,v12版本直接添加'GUILD_MEMBERS'到intents数组。
- 优先拉取全量成员再筛选
不要直接读取角色缓存的成员列表,改为先拉取全服最新成员再做筛选,注意await需要放在async函数内:
// 拉取服务器全量成员,强制同步最新数据 const allMembers = await msg.guild.members.fetch(); // 筛选持有指定角色的成员并提取tag const nameList = allMembers.filter(m => m.roles.cache.has('872029521484873779')).map(m => m.user.tag);
内容的提问来源于stack exchange,提问作者COdeingNinja
相关产品推荐
相关产品推荐

