discord.js v13使用斜杠命令读取presence的status属性报null类型错误
问题原因与解决方案
报错原因
discord.js v13 版本起,成员在线状态(presence)属于特权网关意图,需要单独配置权限才能获取。触发报错的核心原因是member.presence为null时你直接读取了它的status属性,两种场景会导致member.presence为空:
- 机器人未在Discord开发者后台开启
Presence Intent特权权限,或是客户端初始化时未声明GUILD_PRESENCES意图,无法获取成员在线状态数据 - 机器人本地的成员缓存未完全拉取,或是部分成员的在线状态数据还未同步到本地
解决方案
1. 开启开发者后台特权权限
进入Discord开发者平台对应机器人应用的「Bot」设置页,找到Privileged Gateway Intents区域,打开Presence Intent和Server Members Intent两个开关。
2. 客户端初始化时声明所需意图
初始化Client实例时必须显式声明需要用到的网关意图,示例代码如下:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_PRESENCES, // 其他业务需要的意图可继续追加 ] });
3. 业务代码增加非空兼容判断
即使配置了所有权限,机器人刚启动缓存未拉全时仍可能出现presence为null的情况,使用可选链操作符?.做非空判断即可避免报错,修改后的业务代码如下:
const members = interaction.guild.members.cache; .addField('Presencia', `**Conectado:** ${members.filter(member => member.presence?.status === 'online').size}\n` + `**Ausentes:** ${members.filter(member => member.presence?.status === 'idle').size}\n` + `**No Molestar:** ${members.filter(member => member.presence?.status === 'dnd').size}\n` + `**Desconectado:** ${members.filter(member => !member.presence || member.presence.status === 'offline').size}\n` + '\u200b' )
内容的提问来源于stack exchange,提问作者Tuto Mine
相关产品推荐
相关产品推荐

