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
相关产品推荐
相关产品推荐

