discord.js 中的 User 和 GuildMember 有什么区别? [英] What is the difference between a User and a GuildMember in discord.js?
问题描述
我的代码中有很多错误,我相信这是 GuildMembers
和 Users
之间混淆的结果.有人能解释一下区别吗?
const user = message.mentions.users.first();//类型错误:user.kick() 不是函数user.kick({ 原因: '垃圾邮件' });//类型错误:user.ban() 不是函数user.ban({ 原因: 'DM 广告' });//TypeError: message.author.hasPermission() 不是函数如果 (!message.author.hasPermission('ADMINISTRATOR')) 返回;控制台日志(用户.显示名称);//不明确的//TypeError: message.member.createdAt() 不是函数embed.addField('Account Created', message.member.createdAt());client.on('guildMemberUpdate', (oldMember, newMember) => {console.log(`${newMember.tag} 已更新`);//'未定义已更新'});如果(message.member.bot)返回;//不明确的//类型错误:无法读取未定义的属性添加"user.roles.add(newRole)const 目标 = message.client.users.cache.get(args[0])console.log(target.displayName)//未定义
来自 官方 Discord.js 指南 - 常见问题:
<块引用>很多用户对Users
和GuildMembers
之间的区别感到困惑.简单的答案是 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()//这里没有错误!
另一种常见的解决方法是使用 Guild.member()
方法,它接受一个User
对象或 ID!
const user = client.user//获取用户对象const guild = client.guilds.cache.get('Guild ID')//获取公会对象const member = guild.member(user)//将 User 对象转换为 GuildMember!
将Users
轻松转换为GuildMembers
的其他有用技巧包括:
- 使用
message.member
而不是message.author
- 使用
guild.members.cache.get()
而不是client.users.cache.get()
- 使用
guild.members.fetch()
而不是client.users.fetch()
- 使用
presence.member
而不是presence.user
记住特定事件参数是否提供 Users
或 GuildMembers
也非常有用.例如,guildMemberAdd()
和 guildMemberUpdate
通过 GuildMembers
,但是 messageReactionAdd()
, guildBanAdd()
和 typingStart()
全部通过 Users
.
虽然许多 GuildMember
属性和方法对 User
不可用,但反过来也是如此.例如,GuildMember.tag
不存在.但是,将 GuildMember
转换为 User
比将 User
转换为 GuildMember<要容易得多./代码>.这是因为
GuildMember.user
:
该公会成员实例代表的用户
因此,尽管 GuildMember.tag
会返回 undefined
,GuildMember.user.tag
不会!
I've gotten many errors in my code that I believe has been the result of mix-ups between GuildMembers
and Users
. Can someone explain the difference?
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
From Official Discord.js Guide - Common Questions:
A lot of users get confused as to what the difference between
Users
andGuildMembers
is. The simple answer is that aUser
represents a global Discord user and aGuildMember
represents a Discord user on a specific server. That means onlyGuildMembers
can have permissions, roles, and nicknames, for example, because all of these things are server-bound information that could be different on each server that user is in.
Many errors in the code in question occur because you are trying to call a guild specific function on a global user. For example, GuildMember.kick()
and GuildMember.ban()
. A very common mistake that leads to this is using the message.mentions.users
collection. As the name suggests, this returns a collection of Users
.
If you simply want, for example, the mentioned user's avatar, or maybe they're username and discriminator, it would work out fine. But it will lead to errors if you ever try to, for example, try to get the date they joined your server using GuildMember.joinedAt()
Luckily, there are many easy ways to circumvent this issue. For example, using MessageMentions.members
(returns a collection of GuildMembers
) instead of MessageMentions.users
const member = message.mentions.members.first()
member.ban() // no error here!
Another common workaround is using the Guild.member()
method, which accepts a User
object or 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!
Other useful tricks to easily convert Users
to GuildMembers
include:
- Using
message.member
instead ofmessage.author
- Using
guild.members.cache.get()
instead ofclient.users.cache.get()
- Using
guild.members.fetch()
instead ofclient.users.fetch()
- Using
presence.member
instead ofpresence.user
It's also very useful to remember if specific event parameters provide Users
or GuildMembers
. For example, both guildMemberAdd()
and guildMemberUpdate
pass GuildMembers
, but messageReactionAdd()
, guildBanAdd()
, and typingStart()
all pass Users
.
While many GuildMember
properties and methods are not available for a User
, the same is true the other way around. For example, GuildMember.tag
does not exist. However, converting a GuildMember
to a User
is much easier than converting a User
to a GuildMember
. This is because of GuildMember.user
:
The user that this guild member instance represents
So, although GuildMember.tag
will return undefined
, GuildMember.user.tag
will not!
这篇关于discord.js 中的 User 和 GuildMember 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!