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

使用discord.js通过ID获取Guild用户时遇到异常:仅能获取机器人及自身,其余用户返回Undefined

解决discord.js通过ID获取服务器成员返回undefined的问题

嘿,我之前也踩过这个坑!这其实是discord.js v13及更高版本的特权网关意图和默认成员缓存机制共同导致的,咱们一步步来解决:

1. 开启特权网关意图(关键第一步)

Discord为了保护用户隐私,把获取服务器成员列表的权限设成了特权意图,你得先在两个地方配置:

  • Discord开发者平台端:
    打开你的机器人应用页面,进入「Bot」标签页,往下滑找到「Privileged Gateway Intents」,开启Server Members Intent(服务器成员意图),如果需要获取用户在线状态的话也可以开启Presence Intent。
  • 代码端:
    创建Client实例时必须声明要使用的意图,不然机器人根本没有权限获取成员数据:
    const { Client, GatewayIntentBits } = require('discord.js');
    const client = new Client({
      intents: [
        GatewayIntentBits.Guilds, // 基础服务器权限
        GatewayIntentBits.GuildMembers, // 必须加这个才能获取成员
        GatewayIntentBits.GuildMessages, // 如果需要处理消息的话
        GatewayIntentBits.MessageContent // 读取消息内容的权限(v14+需要)
      ]
    });
    

2. 不要依赖缓存,改用fetch获取成员

discord.js的默认成员缓存只存储:

  • 机器人自身
  • 和机器人有过交互的用户(比如发过消息、@过机器人的用户)
  • 机器人启动后新加入服务器的用户

所以对于服务器里已存在的老成员,缓存里根本没有他们的数据,这时候得用fetch方法主动获取:

获取单个成员

try {
  // 直接通过ID获取指定成员
  const targetMember = await message.guild.members.fetch('目标用户ID');
  console.log(`找到成员:${targetMember.user.tag}`);
} catch (err) {
  console.error('获取成员失败:', err);
  // 这里可以处理成员不存在、权限不足等情况
}

批量获取所有成员(小服务器适用)

如果你的服务器成员不多,可以一次性拉取所有成员到缓存,之后就能用cache.get()获取了:

message.guild.members.fetch()
  .then(allMembers => {
    const targetMember = allMembers.get('目标用户ID');
    if (targetMember) {
      console.log(`找到成员:${targetMember.user.tag}`);
    } else {
      console.log('该成员不在服务器中');
    }
  })
  .catch(err => console.error('批量获取成员失败:', err));

注意:大服务器(比如几千人)不要随便用批量fetch,会触发Discord的速率限制,尽量按需单个fetch。

3. 补充:让成员持久化到缓存

如果你希望机器人启动后自动缓存所有成员,除了开启GuildMembers意图,还可以在Client配置里加上fetchAllMembers: true(不过这个选项在v14里已经被弃用了,更推荐按需fetch):

// v13及之前可用,v14已移除
const client = new Client({
  intents: [/* 所需意图 */],
  fetchAllMembers: true
});

这样操作后,应该就能正常获取到所有服务器成员了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:32:36