Discord.js获取指定角色所有成员仅返回自身与机器人问题咨询
问题原因
你遇到的是Discord.js的成员缓存和网关权限问题,具体有两个触发原因:
- 没有开启服务器成员特权网关Intent,Discord默认不会给机器人推送全量服务器成员数据
- 本地缓存默认只会存储机器人上线后有过交互的成员(比如发过消息、新加入服务器的用户),其他存量用户不会主动加入缓存,你单独fetch所有成员时能拿到是因为主动拉取了全量数据更新了缓存
解决步骤
开启特权Intent
访问Discord开发者平台,进入你的机器人应用页,切换到「Bot」选项卡,找到「Privileged Gateway Intents」分区,打开Server Members Intent的开关。初始化客户端时声明对应Intent
Discord.js v13及以上版本要求显式声明需要的网关Intent,初始化客户端时需要加入GuildMembers权限,示例代码:
const { Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, // 基础服务器权限必开 IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent, // 读取消息内容权限 IntentsBitField.Flags.GuildMembers // 读取服务器成员权限,必填 ] });
- 调整业务代码,先拉取全量成员再筛选角色
修改原命令逻辑,获取到服务器对象后先主动拉取全量成员,再读取对应角色的成员列表:
// 注意v13+版本原`message`事件已重命名为`messageCreate` client.on('messageCreate', async (message) => { if (message.content === prefix + 'add') { const guild = client.guilds.cache.get("889906947711701022"); // 主动拉取全量服务器成员,更新本地缓存 await guild.members.fetch(); const targetRole = guild.roles.cache.get('890636907904639027'); const roleMemberIds = targetRole.members.map(m => m.user.id); console.log(roleMemberIds); } });
内容的提问来源于stack exchange,提问作者Oskar
相关产品推荐
相关产品推荐

