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

Discord.js v13 获取指定在线状态人数的代码无报错中断问题

故障原因
  • Discord.js v13 强制要求声明 Gateway Intents,统计成员状态需要开启 GUILD_MEMBERS 和 GUILD_PRESENCES 两个权限Intent,未开启时批量获取的成员数据中presence属性为undefined,直接访问m.presence.status会触发空指针异常,无报错大概率是外层逻辑吞掉了错误。
  • Discord.js 中的缓存集合为继承自Map的Collection类型,获取集合长度需要使用.size属性,原代码使用.length会拿到undefined,也是运行中断的诱因之一。
修复步骤

1. 开启必要权限

首先在Discord开发者后台对应Bot的设置页面,打开「Privileged Gateway Intents」分类下的Server Members Intent和Presence Intent开关。
随后调整客户端初始化代码,声明对应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
  ]
});

2. 优化统计代码,兼容空值场景

修改原统计逻辑,先过滤无状态数据的成员,同时替换.length为.size:

// 若成员缓存不全可先拉取全量数据,需在async函数内执行
// await message.guild.members.fetch();
const members = message.guild.members.cache;
const hasPresenceMembers = members.filter(m => m.presence);
const online = hasPresenceMembers.filter(m => m.presence.status === 'online').size;
const offline = members.filter(m => !m.presence || m.presence.status === 'offline').size;
const dnd = hasPresenceMembers.filter(m => m.presence.status === 'dnd').size;
const afk = hasPresenceMembers.filter(m => m.presence.status === 'idle').size;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:45:02