discord.js 中的 User 和 GuildMember 有什么区别? [英] What is the difference between a User and a GuildMember in discord.js?

查看:22
本文介绍了discord.js 中的 User 和 GuildMember 有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码中有很多错误,我相信这是 GuildMembersUsers 之间混淆的结果.有人能解释一下区别吗?

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 指南 - 常见问题:

<块引用>

很多用户对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()//这里没有错误!

另一种常见的解决方法是使用 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 的其他有用技巧包括:

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


虽然许多 GuildMember 属性和方法对 User 不可用,但反过来也是如此.例如,GuildMember.tag 不存在.但是,将 GuildMember 转换为 User 比将 User 转换为 GuildMember<要容易得多./代码>.这是因为 GuildMember.user:

<块引用>

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

因此,尽管 GuildMember.tag 会返回 undefinedGuildMember.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 and GuildMembers is. The simple answer is that a User represents a global Discord user and a GuildMember represents a Discord user on a specific server. That means only GuildMembers 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:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆