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

如何在Discord.js用户信息命令中获取用户角色?

解决Discord.js用户信息命令中获取角色的问题

你遇到的核心问题是:用getUser()获取的是全局User对象,这个对象不包含服务器(Guild)内的角色数据。角色是和具体服务器绑定的,必须通过GuildMember对象才能获取。

修改步骤:

  1. 替换获取用户的方式:把interaction.options.getUser('target')改成interaction.options.getMember('target'),拿到绑定当前服务器的GuildMember实例。
  2. 传递GuildMember到嵌入构建函数:调用createEmbed时把获取到的成员对象传进去。
  3. 提取并格式化角色列表:通过GuildMember的roles.cache属性获取角色集合,排序后转成可显示的字符串。

修改后的完整代码:

const { SlashCommandBuilder } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('user')
        .setDescription('Display info about a selected user')
        .addUserOption(option => option.setName('target').setDescription('The user\'s information to show')),
    async execute(interaction) {
        // 获取绑定当前服务器的成员对象(GuildMember),如果没选目标则用命令发起者
        const member = interaction.options.getMember('target') || interaction.member;

        if (member) {
            createEmbed(interaction, member);
        }
    },
};

function createEmbed(interaction, member) {
    // 处理角色:按权限位置从高到低排序,转成提及格式,可自行添加filter排除@everyone
    const rolesList = member.roles.cache
        .sort((a, b) => b.position - a.position)
        .map(role => role.toString())
        .join('\n') || '无自定义角色';

    const embed = {
        title: `${member.user.tag} 的用户信息`,
        thumbnail: { url: member.user.displayAvatarURL() },
        fields: [
            {
                name: '用户名',
                value: member.user.username,
                inline: true
            },
            {
                name: '服务器昵称',
                value: member.nickname || '无昵称',
                inline: true
            },
            {
                name: '加入服务器时间',
                value: member.joinedAt?.toLocaleString() || '未知',
                inline: true
            },
            {
                name: '角色',
                value: rolesList,
                inline: false
            }
        ],
        timestamp: new Date(),
        color: member.displayHexColor || 0xffffff
    };

    interaction.reply({ embeds: [embed] });
}

关键说明:

  • GuildMember vs User:User是全局用户数据,GuildMember是用户在特定服务器内的实例,包含角色、昵称、加入时间等服务器相关信息。
  • 角色排序:用b.position - a.position让高权限角色排在前面,和Discord原生的角色显示逻辑一致。
  • 角色提及:role.toString()会自动转成角色的@提及格式(如<@&123456>),发送后Discord会渲染成可点击的角色链接。
  • 边界处理:如果用户只有默认的@everyone角色,会显示“无自定义角色”,你可以根据需求调整提示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:31