Care este diferența dintre un utilizator și un membru al ghildei în discord.js? (Programare, Javascript, Node.Js, Discord, Discord.Js)

Lioness100 a intrebat.
a intrebat.

Am primit multe erori în codul meu care cred că a fost rezultatul unor confuzii între GuildMembers și Users. Poate cineva să explice diferența?

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 răspunsuri
Lioness100

De la Ghid oficial Discord.js – Întrebări frecvente:

O mulțime de utilizatori sunt confuzi în ceea ce privește diferența dintre Users și GuildMembers este. Răspunsul simplu este că un User reprezintă un utilizator Discord global și un GuildMember reprezintă un utilizator Discord de pe un anumit server. Asta înseamnă că doar GuildMembers poate avea permisiuni, roluri și porecle, de exemplu, deoarece toate aceste lucruri sunt informații legate de server care pot fi diferite pe fiecare server pe care se află utilizatorul respectiv.


Multe erori din codul în cauză apar pentru că încercați să apelați o funcție specifică breslei pe un utilizator global. De exemplu, GuildMember.kick() și GuildMember.ban(). O greșeală foarte frecventă care duce la acest lucru este utilizarea funcției message.mentions.users colecției. După cum sugerează și numele, aceasta returnează o colecție de Users.

Dacă doriți pur și simplu, de exemplu, avatarul utilizatorului menționat, sau poate numele de utilizator și discriminatorul acestuia, ar funcționa bine. Dar va duce la erori dacă veți încerca vreodată, de exemplu, să obțineți data la care s-a alăturat serverului dvs. folosind GuildMember.joinedAt()

Din fericire, există multe modalități simple de a ocoli această problemă. De exemplu, folosind MessageMentions.members (returnează o colecție de GuildMembers) în loc de MessageMentions.users

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

O altă soluție obișnuită este utilizarea funcției Guild.member() care acceptă o metodă User obiect sau 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!

Alte trucuri utile pentru a converti cu ușurință Users în GuildMembers includ:

De asemenea, este foarte util să ne amintim dacă anumiți parametri de eveniment oferă Users sau GuildMembers. De exemplu, atât guildMemberAdd() și guildMemberUpdate transmit GuildMembers, dar messageReactionAdd(), guildBanAdd(), și typingStart() toate trec Users.


În timp ce mulți GuildMember proprietăți și metode nu sunt disponibile pentru un User, același lucru este valabil și în sens invers. De exemplu, GuildMember.tag nu există. Cu toate acestea, conversia unui GuildMember în a User este mult mai mult mai ușor decât să convertim a User în a GuildMember. Acest lucru se datorează GuildMember.user:

Utilizatorul pe care îl reprezintă această instanță de membru al breslei

Deci, deși GuildMember.tag va returna undefined, GuildMember.user.tag nu o va face!