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

Discord机器人userinfo命令获取提及用户最高角色异常问题

解决Discord.js中user.highestRole显示自身角色的问题

嘿,我看你在写userinfo命令的时候踩了个小坑——当提及其他用户执行命令时,Embed里的最高角色字段居然显示的是你自己的角色,而不是被提及用户的。这问题我之前帮人排查过,给你说说原因和解决办法!

问题根源

你现在用的user是从message.mentions.users.first()拿到的用户对象(User),但highestRole这个属性是属于**服务器成员对象(GuildMember)**的!用户对象只包含用户的全局信息(比如用户名、头像),没有服务器专属的角色数据,所以当你调用user.highestRole时,代码其实是在当前会话的上下文里 fallback 到了你自己的成员信息,自然就显示你的角色了。

解决办法

我们需要拿到用户对应的服务器成员对象,而不是单纯的用户对象:

  1. 替换获取对象的方式
    直接获取提及的成员,而不是用户:

    let member = message.mentions.members.first() || message.member;
    

    这里message.member就是你自己的成员对象,作为默认值。

  2. 修改Embed中的字段调用
    把原来的user.highestRole换成member.highestRole,同时其他和用户信息相关的字段可以通过member.user来访问(比如member.user.tag、member.user.username)。

修正后的完整代码示例

if(cmd === `${prefix}user`){
  // 优先获取提及的成员,没有的话用命令发送者的成员对象
  let member = message.mentions.members.first() || message.member;
  let userInfo = new Discord.RichEmbed()
    .setAuthor(member.user.tag, member.user.avatarURL)
    .setThumbnail(member.user.displayAvatarURL)
    .setFooter("Informacje Użytkownika")
    .setTimestamp()
    .setColor("#1d1dbb")
    .addField("Nick:", member.user.username)
    // 现在能正确显示被提及用户的最高角色了
    .addField("Najwyższa ranga:", member.highestRole);
  
  message.channel.send(userInfo);
}

小补充

  • 如果不想显示角色的提及格式(带@的那种),只想显示角色名称,可以改成member.highestRole.name
  • 记得确保你的机器人有读取服务器成员的权限,不然可能获取不到GuildMember对象
  • 如果命令可能在DM里被调用,最好加个判断:if(!message.guild) return message.reply("这个命令只能在服务器里使用哦!"),避免因为message.guild为null导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:00:10