javascript - 试图获取 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] });
任何帮助,将不胜感激!
解决方案
是的,几周前我遇到了同样的问题......这解决了我的问题:
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 是这样解释的:
可选的链接运算符 (?.) 使您能够读取位于连接对象链深处的属性值,而无需检查链中的每个引用是否有效。
这意味着,如果presence
是undefined或null,则?.
返回undefined或null而不是停止程序并引发错误。该成员的状态不会添加到集合中,机器人会继续计数。
如果你想了解更多,这里是源
笔记
请记住,这onlineMembers
永远不会 100% 准确。总有会员的状态无法读取!
推荐阅读
- python - 从 Pandas Dataframe 中提取短语后和空格之间的文本
- pyspark - 是否可以直接在数据帧上使用所有 Spark SQL 内置函数而不执行 spark.sql(“临时视图上的 sql 语句”)?
- amazon-web-services - boto3 内省用户 aws 配置以确定配置文件中的 mfa_serial
- go - 使用用户输入停止处理 For 循环
- c++ - 使用钩子向 explorer.exe 主窗口发送消息会导致崩溃?
- python - 如何修复 matplotlib 中所有子图的图例和主标题?
- javascript - Django 不提供开发中的所有 js 文件
- typescript - 函数重载编译错误(此重载签名不兼容)与模板文字类型
- javascript - 使用 MySQL 和 Node.js 从特定类别中获取每个项目的最佳实践是什么?
- next.js - 为什么我的会话在包含刷新令牌时会被清空?