不和谐.js尝试获取 guildMember.presence.status 会导致"Cannot read properties of undefined (reading 'status')"



我一直在乱搞discord.js,并一直试图使一个命令,将允许我列出所有在线用户在一个服务器(公会)。这个片段并不完全是我的,但根据我的理解,我将公会对象从互动中移除,并进一步移除公会成员经理。从那里调用fetch方法来获取所有成员的集合,然后根据状态进行过滤。

async execute(interaction) {
let { guild: { members } } = interaction;
let allMembers = await members.fetch();
let onlineUsers = allMembers.filter((member) => member.presence.status !== 'offline');
let usernames = onlineUsers.map((member) => member.displayName);
// array of usernames of users who are not offline
console.log(usernames);
我得到的错误是:
TypeError: Cannot read properties of undefined (reading 'status')

当我运行node index.js时,似乎有其他用户/其他机器人离线时发生此错误,我认为这是值得一提的。

我相信我已经正确地声明了我的意图:

client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_PRESENCES, Intents.FLAGS.GUILD_MEMBERS] });

这是Discord开发者门户的样子。

任何帮助将不胜感激!

是啊,我几周前也遇到过同样的问题…这就解决了我的问题:

let guildMembers = await <guild>.members.fetch({ withPresences: true })
var onlineMembers = await guildMembers.filter(member => member.presence?.status != "offline").size

如果你想从计数中排除bot,将第二行更改为:

var onlineMembers = await guildMembers.filter(member => !member.user.bot && member.presence?.status != "offline").size

所以你可能已经注意到,它现在只通过在presence之后添加?.来工作,但是为什么呢?

Mozilla这样解释:

可选的链操作符(?.)使您能够读取位于连接对象链深处的属性值,而不必检查链中的每个引用是否有效。

这意味着,如果presence未定义零或?.返回undefined零或而不是停止程序并抛出错误。该成员的状态不会被添加到集合中,并且bot将继续计数。

如果你想了解更多,这里是源代码


注意

请记住,onlineMembers永远不会100%准确。总是有成员的状态无法读取!

相关内容

  • 没有找到相关文章

最新更新