You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.js v13调用member.presence.status报cannot read property 'status'错误

问题成因
  • Discord.js v13 开始强制要求使用网关意图(Gateway Intents),成员状态(Presence)数据需要单独的GUILD_PRESENCES特权意图才会下发。未开启该意图时,仅机器人自身、触发当前交互/消息的用户的Presence数据会被返回,其余缓存内的GuildMember对象的presence字段均为undefined,遍历过程中访问presence.status就会触发报错。
  • message.author返回的是全局User对象,该对象本身没有presence属性,Presence仅存在于服务器对应的GuildMember对象上,因此直接调用message.author.presence.status必然报错。
  • 你测试的两段代码能正常运行,是因为主动获取的机器人自身、消息触发者的GuildMember对象默认携带Presence数据,不受意图未开的影响。
解决方法
  1. 开启必要的网关意图
  • 首先进入Discord开发者后台,找到对应应用的「Bot」设置页,在「Privileged Gateway Intents」分区下开启Presence Intent和Server Members Intent两个特权开关。
  • 初始化客户端时显式声明所需意图,示例代码如下:
const { Client, Intents } = require('discord.js');
const client = new Client({
  intents: [
    Intents.FLAGS.GUILDS, // 基础服务器意图
    Intents.FLAGS.GUILD_MESSAGES, // 消息监听意图
    Intents.FLAGS.GUILD_MEMBERS, // 成员数据意图
    Intents.FLAGS.GUILD_PRESENCES // 成员状态意图
  ]
});
  1. 修正状态获取写法
    获取当前消息发送者的状态时,使用GuildMember类型的message.member代替User类型的message.author,同时添加可选链避免极端情况报错:
    const authorStatus = message.member.presence?.status;

  2. 遍历缓存时添加判空逻辑
    过滤成员状态时添加可选链做兼容,避免部分成员无Presence数据时报错:
    const targetCount = message.guild.members.cache.filter(member => member.presence?.status === "你要匹配的状态值").size;

内容的提问来源于stack exchange,提问作者user15615453

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:42:02