#javascript #node.js #discord.js
#javascript #node.js #discord.js
Вопрос:
я новичок в Discord.js , и пытаюсь создать команду server info, как на картинке ниже. Я застрял в тот момент, когда мне нужно получить всех членов гильдии и отфильтровать их по текущему статусу и bot
свойству. Я прочитал https://discordjs.guide/popular-topics/common-questions.html и там сказано, что мне нужно собрать всех членов гильдии:
msg.guild.members.fetch().then(fetchedMembers => {
const totalOnline = fetchedMembers.filter(member => member.presence.status === 'online');
msg.channel.send(`There are currently ${totalOnline.size} members online in this guild!`);
});
Моя команда отправляется как вставка, и я добавляю количество отфильтрованных участников в переменную, а затем это значение вставляется в поле для вставки. Если я отправляю embed на канал прямо внутри блока then(), он работает, поля для вставки добавляются правильно. Но мне нужно добавить другую информацию о гильдии, такую как количество каналов, владелец, регион и т.д. Если я создаю поля из then() , вместо количества я получаю undefined
.
P.S. извините за мой плохой английский, я не являюсь носителем языка
Ответ №1:
Причина, по которой вы получаете undefined
, заключается в том, что fetch()
это асинхронная функция, то есть она выполняется в фоновом режиме, и как только она завершена, вызывается обратный then
вызов.
Вы не можете поместить его за пределы then()
блока, потому что тогда ваш код будет выполняться до fetch()
завершения и обновления переменной с результатом, кроме того, totalOnline
переменная создается внутри этого блока, поэтому она не будет работать вне его в любом случае, поскольку это локальная переменная внутри этой области.
Эта статья может облегчить понимание: https://www.freecodecamp.org/news/async-await-javascript-tutorial /
Вы можете использовать дополнительную необходимую информацию внутри этой области. Например:
msg.guild.members.fetch().then(fetchedMembers => {
const totalOnline = fetchedMembers.filter(member => member.presence.status === 'online');
msg.channel.send(`There are currently ${totalOnline.size} members online in ${msg.guild.name}!`);
});
Комментарии:
1. Спасибо! Я собираюсь прочитать эту статью, я думаю, это должно помочь.
Ответ №2:
Что вы могли бы сделать вместо использования fetch()
, так это просто присвоить переменную коллекции членов.
// v12
let allmembers = message.guild.members.cache;
// v11
let allmembers = message.guild.members;
Как только у вас это будет, вы можете отфильтровать это и поместить во вставку или сообщение и т. Д.
const totalOnline = allmembers.filter(member => member.presence.status === 'online');
message.channel.send(`There are currently ${totalOnline.size} members online in ${message.guild.name}!`);
Ответ №3:
Ответ для discord.js v13
:
let members = (await guild.members.fetch())
.filter(m => m._roles.includes(ROLE_ID));
let member_ids = members.map(m => m.user.id);
let member_count = members.size();