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数据,不受意图未开的影响。
解决方法
- 开启必要的网关意图
- 首先进入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 // 成员状态意图 ] });
修正状态获取写法
获取当前消息发送者的状态时,使用GuildMember类型的message.member代替User类型的message.author,同时添加可选链避免极端情况报错:const authorStatus = message.member.presence?.status;遍历缓存时添加判空逻辑
过滤成员状态时添加可选链做兼容,避免部分成员无Presence数据时报错:const targetCount = message.guild.members.cache.filter(member => member.presence?.status === "你要匹配的状态值").size;
内容的提问来源于stack exchange,提问作者user15615453
相关产品推荐
相关产品推荐

