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

如何在Discord.js中将拥有指定角色的所有用户存入数组

问题原因
  • 缺少GUILD_MEMBERS网关权限:Discord.js v12及以上版本默认不开启全服成员拉取权限,你需要同时在Discord开发者后台的Bot设置页开启Server Members Intent特权意图,且在初始化客户端时声明该意图,否则Bot只能拉取到已进入本地缓存的少量成员(比如自身、近期发过消息的用户),就会出现仅返回1个用户的情况。
  • 本地缓存未同步:即使开启了权限,刚启动的Bot本地成员缓存可能未拉取全量数据,直接从缓存读取角色关联成员也会缺漏。
修复步骤
  1. 开启后台特权意图
    进入Discord Developer Portal的对应Bot应用页,找到「Bot」设置栏,下拉到「Privileged Gateway Intents」区域,开启Server Members Intent开关并保存。

  2. 客户端初始化声明对应意图
    根据你使用的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数组。

  1. 优先拉取全量成员再筛选
    不要直接读取角色缓存的成员列表,改为先拉取全服最新成员再做筛选,注意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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:39:03