首页 > 解决方案 > 试图获取 guildMember.presence.status 的 discord.js 导致“无法读取未定义的属性(读取 '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 开发者门户的样子。

任何帮助,将不胜感激!

标签: javascriptnode.jsdiscorddiscord.jsnode-modules

解决方案


是的,几周前我遇到了同样的问题......这解决了我的问题:

let guildMembers = await <guild>.members.fetch({ withPresences: true })

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

如果要从计数中排除机器人,请将第二行更改为:

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

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

Mozilla 是这样解释的:

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

这意味着,如果presenceundefinednull,则?.返回undefinednull而不是停止程序并引发错误。该成员的状态不会添加到集合中,机器人会继续计数。

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


笔记

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


推荐阅读