discord.js 中的 User 和 GuildMember 有什么区别?

IT技术 javascript node.js discord discord.js
2021-02-02 11:28:01

我的代码中有很多错误,我认为这是GuildMembers之间混淆的结果Users有人可以解释一下区别吗?

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
1个回答

来自官方 Discord.js 指南 - 常见问题

许多用户对Users之间的区别感到困惑GuildMembers简单的答案是 aUser代表全局 Discord 用户,aGuildMember代表特定服务器上的 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!

其他有用的技巧可以轻松地转换UsersGuildMembers包括:

记住特定事件参数是否提供Users也非常有用GuildMembers例如,无论是guildMemberAdd()guildMemberUpdate传球GuildMembers,但是messageReactionAdd()guildBanAdd()typingStart()所有通Users


虽然许多GuildMember属性和方法对 a 不可用User,但反过来也是如此。例如,GuildMember.tag不存在。然而,转换GuildMemberUser比转换更容易UserGuildMember这是因为GuildMember.user

该公会成员实例所代表的用户

所以,虽然GuildMember.tag会回来undefinedGuildMember.user.tag不会!