Discord.js获取服务器成员不全 如何按用户名查询指定Discord成员
核心问题原因
你遇到的返回不全/undefined是两个问题导致的:
- 所有原有写法都直接读取本地缓存,而Discord.js默认不会将服务器全量成员存入缓存,仅会缓存机器人启动后产生过交互、发过消息的成员,以及所有BOT账号
- 部分API用法错误,比如
client.users.cache.get()仅接受用户ID作为入参,不支持按用户名字段查询
前置校验
首先确认你的配置完全正确:
- Discord开发者后台已经开启
Server Members Intent权限 - 实例化Client时已经正确配置对应权限,示例(v14版本):
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 基础服务器权限必须开启 GatewayIntentBits.GuildMembers, // 成员读取权限,和后台开启的Intent对应 // 其他你需要的权限自行添加 ] });
解决方案
不要直接读取缓存,主动调用API拉取服务器全量成员后再匹配,示例代码如下:
// 封装成异步方法,入参为服务器ID、要匹配的目标用户名 async function findUserByUsername(guildId, targetUsername) { // 先拉取服务器实例 const targetGuild = await client.guilds.fetch(guildId); // 拉取全量成员,force: true 表示跳过本地缓存直接请求API const allMembers = await targetGuild.members.fetch({ force: true }); // 匹配用户名完全一致的用户,返回第一个匹配结果 return allMembers.find(member => member.user.username === targetUsername); } // 消息场景下调用示例 const matchedUser = await findUserByUsername(msg.guildId, '你要匹配的用户名'); if (matchedUser) { console.log('找到匹配用户:', matchedUser.user.tag); } else { console.log('无匹配用户'); }
注意事项
- 全量成员拉取接口有严格频率限制,不要频繁调用,拉取后可自行维护本地缓存定期更新即可
- 如果需要匹配的是用户在服务器内的昵称,将匹配条件替换为
member.nickname === targetUsername即可 - Discord.js v13及更低版本的Intent写法调整为
Intents.FLAGS.GUILDS、Intents.FLAGS.GUILD_MEMBERS即可,核心逻辑不变
内容的提问来源于stack exchange,提问作者Kyou Izumi
相关产品推荐
相关产品推荐

