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

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);
    // 这里处理用户不在当前服务器的情况
  }
}

必要前提

  1. 你的机器人必须开启GUILD_MEMBERS特权网关意图:
    • 登录Discord开发者后台,找到你的机器人,在「Privileged Gateway Intents」中开启Server Members Intent
    • 代码中初始化客户端时启用意图:
      const { Client, GatewayIntentBits } = require('discord.js');
      const client = new Client({
        intents: [
          GatewayIntentBits.Guilds,
          GatewayIntentBits.GuildMembers // 必须添加这个
          // 其他需要的意图
        ]
      });
      
  2. 所有fetch方法都是异步操作,必须在async函数内使用await调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:03:22