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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:11