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

Discord.js v13 检测用户状态分配角色时presence未定义错误求解

问题解答

报错产生原因

  1. 核心写法错误:Discord.js v13中member.user返回的是全局User对象,该对象不携带服务器专属的presence属性,presence属于GuildMember层级的属性,也可以直接从presenceUpdate事件的newPresence参数直接获取,你尝试访问member.user.presence自然返回undefined,读取其activities属性就会触发类型错误。
  2. 额外潜在问题:如果机器人未开启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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:03