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

Discord.js v13 无法获取Discord服务器离线成员ID问题求助

问题原因
  • 你已经正确配置了GUILD_MEMBERS权限以及开发者后台的对应Intent开关,问题核心是Discord.js 不会默认预加载服务器全量成员缓存,默认仅缓存在线成员、近期和机器人产生过交互的成员,因此未交互的离线成员不会出现在message.guild.members.cache中。
  • 此前功能正常是因为v12及更早版本的Discord.js默认开启全量成员拉取,v13及之后版本取消了该默认行为,避免不必要的资源占用。
修复方案

方案1:单次拉取全量成员(推荐大多数场景使用)

不需要改客户端初始化配置,需要读取全量成员时直接调用fetch方法从Discord接口拉取最新数据,不走本地缓存:

// 注意调用该方法的上下文需要支持async/await
const allMembers = await message.guild.members.fetch();
allMembers.forEach(element => { console.log(element.user) });

该方法会自动处理1000人以上服务器的分页拉取逻辑,无需额外适配。

方案2:启动时预加载全量成员缓存(适合需要高频使用全量成员的场景)

Discord.js v13 版本配置:

在客户端初始化时添加对应配置项,启动后自动拉取所有加入服务器的全量成员到缓存:

const client = new Client({
  intents: [
    Intents.FLAGS.GUILDS, 
    Intents.FLAGS.GUILD_MESSAGES, 
    Intents.FLAGS.GUILD_MEMBERS, 
    Intents.FLAGS.GUILD_MESSAGE_REACTIONS
  ],
  partials: ['GUILD_MEMBER'],
  fetchAllMembers: true
});

Discord.js v14 及以上版本配置:

v14已移除fetchAllMembers配置项,在客户端ready事件中手动拉取即可:

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.GuildMembers,
    GatewayIntentBits.GuildMessageReactions
  ],
  partials: [Partials.GuildMember]
});

client.on('ready', async () => {
  for (const guild of client.guilds.cache.values()) {
    await guild.members.fetch();
  }
});

注意:该方案会增加机器人启动耗时和内存占用,若机器人加入的服务器总成员数超过10万不建议使用。

内容的提问来源于stack exchange,提问作者tvlss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:06:03