discord.js 试图获得 guildMember.presence.status 结果 "Cannot read properties of undefined (reading 'status')"

discord.js attempting to get guildMember.presence.status results in "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我认为值得一提的时候,当有其他users/other个机器人处于离线状态时,似乎会发生此错误。

我认为我的意图是正确的:

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

This is what the Discord developer portal looks like.

如有任何帮助,我们将不胜感激!

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

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

所以您可能已经注意到,现在只有在 presence 之后添加 ?. 才能正常工作,但为什么呢?

Mozilla 是这样解释的:

The optional chaining operator (?.) enables you to read the value of a property located deep within a chain of connected objects without having to check that each reference in the chain is valid.

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

如果你想了解更多,here's来源


备注

请记住,onlineMembers 永远不会 100% 准确。总有会员状态读不出来!