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

为什么discord.js中presence的status属性失效并报读取null属性错误

错误原因

你遇到的报错是因为代码尝试读取null对象的status属性,即部分成员的presence字段值为null,导致调用member.presence.status失败。该问题通常由两个原因导致:

  1. 未开启Discord机器人的特权网关意图:discord.js v13及以上版本要求开发者手动开启GUILD_PRESENCES(在线状态意图)和GUILD_MEMBERS(服务器成员意图),否则机器人无法从Discord网关获取到成员的在线状态数据,对应presence字段会返回null。
  2. 缺少空值兼容逻辑:部分成员的在线状态可能因权限、隐私设置对机器人不可见,就算开启了意图也可能出现presence为null的情况,未做空值判断就直接调用属性会直接抛出异常。

修复方案

  • 第一步:开启特权网关意图
    登录Discord开发者平台,进入对应机器人的应用页面,切换到「Bot」选项卡,找到「Privileged Gateway Intents」板块,打开Presence Intent和Server Members Intent两个开关。
  • 第二步:客户端初始化时声明对应意图
    初始化Discord客户端时,必须在配置项中声明需要用到的网关意图,示例代码如下:
    如果是discord.js v14版本:
    const { Client, GatewayIntentBits } = require('discord.js');
    const client = new Client({
      intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.GuildPresences,
        // 其他你需要用到的意图
      ]
    });
    
    如果是discord.js v13版本:
    const { Client, Intents } = require('discord.js');
    const client = new Client({
      intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MEMBERS,
        Intents.FLAGS.GUILD_PRESENCES,
        // 其他你需要用到的意图
      ]
    });
    
  • 第三步:修改统计逻辑,增加空值兼容
    调整你的embed字段中的统计逻辑,增加空值判断避免报错,同时可以用总人数减去在线人数来计算离线人数,简化逻辑:
    // 先拉取全量成员数据,避免缓存不全导致统计不准
    await message.guild.members.fetch();
    // 统计在线人数,过滤presence为null的成员
    const onlineCount = message.guild.members.cache.filter(member => member.presence?.status !== 'offline').size;
    const offlineCount = message.guild.memberCount - onlineCount;
    
    // 替换原来的addField内容
    .addField(`Количество участников: ${message.guild.memberCount}`, `В сети: ${onlineCount}\nНе в сети: ${offlineCount}`, false)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:30:04