Discord.js中如何获取用户的服务器Guild Nickname(昵称)
解决方案
核心逻辑说明
interaction.user是全局Discord用户对象,仅存储用户名、头像等全平台通用信息,不会包含服务器专属的昵称数据,因此你无法从该对象下获取到服务器内昵称。
服务器专属的用户信息全部存储在interaction.member(GuildMember类型)对象中。
常见调用失败原因及修复方案
你之前尝试调用interaction.member.displayName未成功,一般是以下几个原因导致:
1. 未开启必要的网关意图
Discord v10+ API要求获取服务器成员数据必须开启对应意图,你需要做两处配置:
- 登录Discord开发者平台,进入对应机器人的「Bot」设置页,在Privileged Gateway Intents分类下开启
Server Members Intent - 代码初始化Client时,声明对应的意图:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, // 服务器基础数据必填 GatewayIntentBits.GuildMembers, // 服务器成员数据必填 // 其他业务需要的意图可自行补充 ] });
2. 未判断交互来源场景
如果用户在私聊场景触发交互,interaction.member会返回null,调用属性会报错,需要先做场景判断。
最终可用代码示例
client.on('interactionCreate', async interaction => { // 全局用户名,所有场景都可用 const globalUsername = interaction.user.username; // 非服务器场景直接走私聊逻辑 if (!interaction.inGuild()) { // 私聊无服务器昵称,可直接用globalUsername // 你的私聊逻辑 return; } // 场景1:自动适配的显示名称,优先返回服务器昵称,没设置则返回全局用户名 const serverDisplayName = interaction.member.displayName; // 场景2:仅获取用户手动设置的专属服务器昵称,没设置则返回null const customServerNickname = interaction.member.nickname; // 后续业务逻辑 });
补充排查点
如果配置完成后仍无法获取,可确认两点:
- 机器人在对应服务器拥有「查看成员」权限
- 升级discord.js到最新稳定版,避免旧版本API兼容问题
内容的提问来源于stack exchange,提问作者Osian
相关产品推荐
相关产品推荐

