Discord.js V14获取用户状态报错:Cannot read properties of null (reading 'status')
解决Discord.js获取用户状态时的TypeError问题
错误原因
出现Cannot read properties of null (reading 'status')是因为member.presence为null,通常由以下原因导致:
- 未启用GuildPresences和GuildMembers网关意图(Intents),Discord API不会推送状态和成员数据到客户端
- 目标成员不在本地缓存中,直接调用
cache.get无法获取包含状态的完整成员对象 - 机器人缺少获取用户状态的权限
解决步骤
1. 配置必要的网关意图
创建Discord客户端时,必须明确声明所需的意图,否则无法获取状态数据:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, // 用于获取成员基础数据 GatewayIntentBits.GuildPresences // 用于获取用户在线状态 ] });
同时需要在Discord开发者门户的机器人页面,开启Privileged Gateway Intents中的Presence Intent和Server Members Intent权限。
2. 主动拉取成员数据(避免依赖缓存)
不要直接依赖本地缓存获取成员,改用fetch方法从API拉取最新数据,确保拿到包含状态的完整对象:
client.on("ready", async () => { console.log( chalk.bgGreen("CLIENT"), chalk.cyanBright(`${client.user.displayName} is ready`) ); const guildId = "1151374436340088852"; const memberId = "1098103731972747425"; try { const guild = client.guilds.cache.get(guildId); if (!guild) { console.log("无法找到指定服务器"); return; } // 强制从API拉取成员最新数据,忽略本地缓存 const member = await guild.members.fetch({ user: memberId, force: true }); if (!member) { console.log("无法找到指定成员"); return; } // 检查状态是否存在,避免null报错 if (member.presence) { const status = member.presence.status; sMap.set("status", status); console.log(`用户状态:${status}`); } else { console.log("无法获取用户状态,请检查Intent和权限配置"); sMap.set("status", "offline"); // 设置默认状态 } } catch (error) { console.error("获取用户状态失败:", error); } });
3. 确认机器人权限
确保机器人在目标服务器中拥有查看成员和查看在线状态的基础权限(这两个权限默认开启,若服务器有特殊权限设置需手动确认)。
内容的提问来源于stack exchange,提问作者Mohtasim Alam Sohom
相关产品推荐
相关产品推荐

