首页 > 解决方案 > 获取公会成员并过滤他们(Discord.js)

问题描述

我是 Discord.js 的新手,正在尝试制作如下图所示的服务器信息命令。我被困在需要获取所有公会成员并按当前状态和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!`);
});

我的命令作为嵌入发送,我将过滤后的成员计数添加到变量中,然后将此值插入到嵌入字段中。如果我将嵌入发送到 then() 块内的通道,它正在工作,嵌入字段被正确添加。但是我需要添加有关公会的其他信息,例如频道数、所有者、区域等。如果我在 then() 之外创建字段,而不是我得到的计数undefined

PS对不起我的英语不好,我不是母语人士

标签: javascriptnode.jsdiscord.js

解决方案


你得到的原因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}!`);
});

推荐阅读