Discord.js v13 检测用户状态分配角色时presence未定义错误求解
问题解答
报错产生原因
- 核心写法错误:Discord.js v13中
member.user返回的是全局User对象,该对象不携带服务器专属的presence属性,presence属于GuildMember层级的属性,也可以直接从presenceUpdate事件的newPresence参数直接获取,你尝试访问member.user.presence自然返回undefined,读取其activities属性就会触发类型错误。 - 额外潜在问题:如果机器人未开启
GUILD_PRESENCES特权意图,也会出现presence数据为空的情况。
修复步骤
第一步:开启必需的意图配置
首先需要在Discord开发者平台的机器人设置页面,开启Presence Intent和Server Members Intent两个特权意图,之后在客户端初始化时声明对应意图:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_PRESENCES ] });
第二步:修改事件代码
修正错误的presence读取路径,同时增加边界判断和异常处理,避免其他报错:
client.on('presenceUpdate', async (oldPresence, newPresence) => { // 过滤非服务器的presence更新 if (!newPresence.guild || !newPresence.member) return; const targetRole = newPresence.guild.roles.cache.get('910192386267840513'); // 角色不存在则直接终止 if (!targetRole) return; // 遍历所有活动检测是否包含邀请链接 const hasInviteInStatus = newPresence.activities.some(activity => { if (!activity.state) return false; return activity.state.includes('.gg/') || activity.state.includes('discord.gg/'); }); const userHasRole = newPresence.member.roles.cache.has(targetRole.id); try { if (hasInviteInStatus && !userHasRole) { await newPresence.member.roles.add(targetRole); } else if (!hasInviteInStatus && userHasRole) { await newPresence.member.roles.remove(targetRole); } } catch (error) { // 权限不足等异常情况打印日志避免崩溃 console.error('角色操作执行失败:', error); } });
额外优化说明
- 原代码仅检测第一个活动的状态,修改后遍历所有活动,避免用户多开活动时漏检
- 增加了异步操作的异常捕获,避免机器人权限不足(比如要操作的角色等级高于机器人自身角色)时程序直接崩溃
- 增加了多处空值判断,覆盖各种边界场景
内容的提问来源于stack exchange,提问作者Sharow
相关产品推荐
相关产品推荐

