Discord.js中如何将数据库存储的User_ID转换为用户名?
解决方案
核心问题
你从数据库取出的submitted_by_id只是纯用户ID(字符串/数字),并非Discord.js提供的User或GuildMember对象,因此直接访问.username会返回undefined。缓存获取失败则是因为目标用户不在机器人的本地缓存中,需要主动调用API拉取数据。
方法1:获取全局用户对象(无需服务器成员权限)
如果仅需要用户的基础信息(如用户名、头像),可以直接通过机器人客户端拉取全局用户数据,不受服务器缓存限制:
// 确保代码在async函数内 const user = await client.users.fetch(submitted_by_id); console.log(user.username); // 输出用户名
方法2:获取服务器成员对象(需服务器内信息)
如果需要用户在当前服务器的专属数据(如服务器昵称、角色),可以先尝试缓存获取,失败则调用API拉取:
// 确保代码在async函数内 const guild = interaction.guild; let member = guild.members.cache.get(submitted_by_id); if (!member) { try { member = await guild.members.fetch(submitted_by_id); console.log(member.user.username); // 基础用户名 console.log(member.displayName); // 服务器内的昵称 } catch (err) { console.error("无法获取该成员:", err); // 这里处理用户不在当前服务器的情况 } }
必要前提
- 你的机器人必须开启
GUILD_MEMBERS特权网关意图:- 登录Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」中开启
Server Members Intent - 代码中初始化客户端时启用意图:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers // 必须添加这个 // 其他需要的意图 ] });
- 登录Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」中开启
- 所有
fetch方法都是异步操作,必须在async函数内使用await调用。
内容的提问来源于stack exchange,提问作者snow
相关产品推荐
相关产品推荐

