【问题标题】:What is the difference between a User and a GuildMember in discord.js?discord.js 中的 User 和 GuildMember 有什么区别?
【发布时间】:2021-01-06 18:28:15
【问题描述】:

我的代码中有很多错误,我认为这是GuildMembersUsers 混淆的结果。有人能解释一下区别吗?

const user = message.mentions.users.first();

// TypeError: user.kick() is not a function
user.kick({ reason: 'spamming' });

// TypeError: user.ban() is not a function
user.ban({ reason: 'DM Advertising' });

// TypeError: message.author.hasPermission() is not a function
if (!message.author.hasPermission('ADMINISTRATOR')) return;

console.log(user.displayName); // undefined

// TypeError: message.member.createdAt() is not a function
embed.addField('Account Created', message.member.createdAt());

client.on('guildMemberUpdate', (oldMember, newMember) => {
 console.log(`${newMember.tag} was updated`); // 'undefined was updated'
});

if (message.member.bot) return; // undefined

// TypeError: Cannot read property 'add' of undefined
user.roles.add(newRole)

const target = message.client.users.cache.get(args[0])
console.log(target.displayName) // undefined

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    来自Official Discord.js Guide - Common Questions

    很多用户对UsersGuildMembers 之间的区别感到困惑。简单的答案是 User 代表全局 Discord 用户,GuildMember 代表特定服务器上的 Discord 用户。这意味着只有 GuildMembers 可以拥有权限、角色和昵称,例如,因为所有这些都是服务器绑定信息,在用户所在的每台服务器上可能会有所不同。


    由于您试图在全局用户上调用公会特定的函数,所以有问题的代码中出现了许多错误。例如,GuildMember.kick()GuildMember.ban()。导致这种情况的一个非常常见的错误是使用message.mentions.users 集合。顾名思义,这会返回 Users 的集合。

    例如,如果您只是想要提到的用户的头像,或者他们可能是用户名和鉴别器,那么就可以了。但是,如果您尝试使用 GuildMember.joinedAt() 尝试获取他们加入您的服务器的日期,则会导致错误

    幸运的是,有很多简单的方法可以规避这个问题。例如,使用MessageMentions.members(返回GuildMembers的集合)而不是MessageMentions.users

    const member = message.mentions.members.first()
    member.ban() // no error here!
    

    另一个常见的解决方法是使用Guild.member() 方法,它接受User 对象 ID!

    const user = client.user // get the user object
    const guild = client.guilds.cache.get('Guild ID') // get the guild object
    
    const member = guild.member(user) // convert the User object to a GuildMember!
    

    轻松将Users 转换为GuildMembers 的其他有用技巧包括:

    记住特定事件参数是否提供UsersGuildMembers 也非常有用。比如guildMemberAdd()guildMemberUpdate都通过GuildMembers,但是messageReactionAdd()guildBanAdd()typingStart()都通过Users


    虽然许多GuildMember 属性和方法不适用于User,但反过来也是如此。例如,GuildMember.tag 不存在。但是,将GuildMember 转换为User 比将User 转换为GuildMember 容易很多。这是因为GuildMember.user

    这个公会成员实例代表的用户

    所以,虽然GuildMember.tag 会返回undefined,但GuildMember.user.tag 不会!

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2019-05-06
      • 1970-01-01
      • 2012-06-15
      • 2017-06-10
      • 1970-01-01
      • 2020-08-24
      • 2015-10-20
      相关资源
      最近更新 更多