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

Discord.js中获取presence.status与nickname时的离线用户报错问题排查——是否与Intents相关?

问题解答:是的,该报错确实由Intents配置问题导致,同时需补充代码防护

核心原因分析

你遇到的 TypeError: Cannot read property 'status' of null,本质是因为当目标用户离线时,memberResult.presence 返回了 null——这是Discord.js的默认行为:如果未开启对应的特权Intent,Discord不会返回离线用户的Presence状态数据,直接访问status自然会触发空值报错。

具体修复步骤

1. 启用Discord开发者平台的特权Intent

首先需要在Discord应用后台开启权限:

  • 进入你的Discord应用Bot管理页面
  • 找到「Privileged Gateway Intents」板块,开启 Presence Intent 和 Server Members Intent(后者确保能正确获取服务器成员的完整数据)

2. 在代码中配置正确的Intents

在创建Discord Client的代码里,必须包含GuildPresences Intent,示例如下:

const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds, // 基础服务器Intent,必须开启
    GatewayIntentBits.GuildMembers, // 获取成员数据需要
    GatewayIntentBits.GuildPresences // 关键:获取Presence状态必须开启这个
  ]
});

3. 补充代码空值防护(额外保险)

即使开启了Intent,极端情况下presence仍可能为null(比如用户刚离开服务器等),建议给代码加空值检查,避免报错:

let userStatus = 'Unknown';
// 先判断presence是否存在,再访问status
if (memberResult?.presence) {
  switch(memberResult.presence.status) {
    case 'offline':
      userStatus = 'Offline';
      break;
    case 'idle':
      userStatus = 'Idle';
      break;
    case 'dnd':
      userStatus = 'Do Not Disturb';
      break;
    case 'online':
      userStatus = 'Online';
      break;
  }
}

这里用了可选链操作符?.,如果memberResult.presence是null,会直接跳过判断,避免触发报错。

额外小提示

你的代码里还有两个小细节可以优化:

  • Embed字段的Uptime显示的是机器人的在线时长,而非目标用户的,若需修正可后续调整;
  • 字段配置里重复写了inline: false, inline: true,建议删掉重复的inline: false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 02:52:39