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

Discord.js获取指定角色所有成员仅返回自身与机器人问题咨询

问题原因

你遇到的是Discord.js的成员缓存和网关权限问题,具体有两个触发原因:

  • 没有开启服务器成员特权网关Intent,Discord默认不会给机器人推送全量服务器成员数据
  • 本地缓存默认只会存储机器人上线后有过交互的成员(比如发过消息、新加入服务器的用户),其他存量用户不会主动加入缓存,你单独fetch所有成员时能拿到是因为主动拉取了全量数据更新了缓存

解决步骤

  1. 开启特权Intent
    访问Discord开发者平台,进入你的机器人应用页,切换到「Bot」选项卡,找到「Privileged Gateway Intents」分区,打开Server Members Intent的开关。

  2. 初始化客户端时声明对应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 // 读取服务器成员权限,必填
  ]
});
  1. 调整业务代码,先拉取全量成员再筛选角色
    修改原命令逻辑,获取到服务器对象后先主动拉取全量成员,再读取对应角色的成员列表:
// 注意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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:27:03