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

Discord.js获取服务器成员不全 如何按用户名查询指定Discord成员

核心问题原因

你遇到的返回不全/undefined是两个问题导致的:

  • 所有原有写法都直接读取本地缓存,而Discord.js默认不会将服务器全量成员存入缓存,仅会缓存机器人启动后产生过交互、发过消息的成员,以及所有BOT账号
  • 部分API用法错误,比如client.users.cache.get()仅接受用户ID作为入参,不支持按用户名字段查询

前置校验

首先确认你的配置完全正确:

  1. Discord开发者后台已经开启Server Members Intent权限
  2. 实例化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:02