From Discord.js 官方指南 - 常见问题 https://discordjs.guide/popular-topics/common-questions.html#how-do-i-create-a-restart-command:
许多用户对它们之间的区别感到困惑Users
and GuildMembers
是。简单的答案是User
代表全球 Discord 用户和GuildMember
代表特定服务器上的 Discord 用户。这意味着仅GuildMembers
例如,可以具有权限、角色和昵称,因为所有这些都是服务器绑定的信息,这些信息在用户所在的每个服务器上可能有所不同。
由于您尝试对全局用户调用公会特定函数,因此相关代码中会出现许多错误。例如,GuildMember.kick() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=kick and GuildMember.ban() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=ban。导致这种情况的一个非常常见的错误是使用message.mentions.users https://discord.js.org/#/docs/main/stable/class/MessageMentions?scrollTo=users收藏。顾名思义,这会返回一个集合Users
.
例如,如果您只是想要提到的用户的头像,或者可能是用户名和标识符,那就可以了。但是,如果您尝试使用以下方法来获取他们加入您的服务器的日期,则会导致错误:GuildMember.joinedAt() https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=joinedAt
幸运的是,有很多简单的方法可以避免这个问题。例如,使用MessageMentions.members https://discord.js.org/#/docs/main/stable/class/MessageMentions?scrollTo=users(返回一个集合GuildMembers
) 代替MessageMentions.users
const member = message.mentions.members.first()
member.ban() // no error here!
另一种常见的解决方法是使用Guild.member() https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=member方法,它接受一个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!
其他轻松转换的有用技巧Users
to GuildMembers
包括:
- Using message.member https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=member代替message.author https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=author
- Using guild.members.cache.get() https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=cache代替client.users.cache.get() https://discord.js.org/#/docs/main/stable/class/UserManager?scrollTo=cache
- Using guild.members.fetch() https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=fetch代替client.users.fetch() https://discord.js.org/#/docs/main/stable/class/UserManager?scrollTo=fetch
- Using presence.member https://discord.js.org/#/docs/main/stable/class/Presence?scrollTo=member代替presence.user https://discord.js.org/#/docs/main/stable/class/Presence?scrollTo=user
记住特定事件参数是否提供也非常有用Users
or GuildMembers
。例如,两者guildMemberAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildMemberAdd and guildMemberUpdate https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildMemberUpdate pass GuildMembers
, but messageReactionAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-messageReactionAdd, guildBanAdd() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildBanAdd, and typingStart() https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-typingStart全部通过Users
.
虽然很多GuildMember
属性和方法不可用于User
,反之亦然。例如,GuildMember.tag
不存在。然而,转换一个GuildMember
to a User
is much比转换更容易User
to a GuildMember
。这是因为GuildMember.user https://discord.js.org/#/docs/main/stable/class/GuildMember?scrollTo=user:
该公会成员实例代表的用户
所以,虽然GuildMember.tag
将返回undefined
, GuildMember.user.tag
将不会!