使用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
相关产品推荐
相关产品推荐

