试图获取 guildMember.presence.status 的 discord.js 导致“无法读取未定义的属性(读取 'status')”

Posted

技术标签:

【中文标题】试图获取 guildMember.presence.status 的 discord.js 导致“无法读取未定义的属性(读取 \'status\')”【英文标题】:discord.js attempting to get guildMember.presence.status results in "Cannot read properties of undefined (reading 'status')"试图获取 guildMember.presence.status 的 discord.js 导致“无法读取未定义的属性(读取 'status')” 【发布时间】:2021-11-19 06:09:37 【问题描述】:

我一直在搞乱 discord.js,并一直在尝试制作一个命令,让我可以列出服务器 (Guild) 中的所有在线用户。这个sn-p不完全是我的,但据我了解,我是从互动中取出公会对象,再往里取出公会管理员。从那里调用 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] );

This is what the Discord developer portal looks like.

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

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

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 是这样解释的:

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

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

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


注意

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

【讨论】:

“这里的关键是presence?.?. 允许您在无法读取存在的情况下继续计数。” 不完全正确。如果presence 为空或未定义,则返回空或未定义。这是虚假的,不会将其添加到新集合中。 是的,即使presenceundefinded/ null,您也可以继续计算在线会员数 否则程序会停止并抛出错误 按照你说的,好像完全忽略 我的措辞有点糟糕。我已经重写了

以上是关于试图获取 guildMember.presence.status 的 discord.js 导致“无法读取未定义的属性(读取 'status')”的主要内容,如果未能解决你的问题,请参考以下文章

laravel 试图获取非对象的属性

试图获取非对象的属性“主机名”

Blade - 试图获取非对象的属性

试图返回属性给出:PHP试图获取非对象的属性

试图获取非对象的属性 [laravel 5.2]

试图获取非对象的属性