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

Discord.js v14 presenceUpdate报错:Cannot read properties of null (reading 'includes')

解决Discord机器人presenceUpdate事件中的TypeError问题

问题描述

我开发Discord机器人时,想要实现:当用户状态描述包含.gg/slayde链接时为其添加指定角色,反之移除该角色。但运行代码时触发TypeError: Cannot read properties of null (reading 'includes')错误,原代码如下:

const { Client, GatewayIntentBits, Collection } = require('discord.js');
const config = require('./config');

const bot = new Client({ 
    intents: [3276799]
});

bot.commands = new Collection()

require('./src/Structure//Handler/Event')(bot);
require('./src/Structure//Handler/Command')(bot);

bot.on('presenceUpdate', async (oldPresence, newPresence) => {
    const role = newPresence.guild.roles.cache.get("1048286446345261137");
    const member = newPresence.member
    const activities = newPresence.activities[0];
    if (activities && (activities.state.includes(".gg/slayde" ) || activities.state.includes(".gg/slayde"))) {
      return newPresence.member.roles.add(role)
    } else {
      if(member.roles.cache.get(role.id)) {
        newPresence.member.roles.remove(role)
      }
    }
  })

bot.login(config.clients.token);

错误原因

  1. 未校验activities.state是否为null:用户的活动状态可能没有设置描述文本,此时activities.state为null,直接调用includes会触发空值读取错误
  2. 缺少核心对象的空值校验:newPresence.member或目标角色可能不存在,后续操作会引发额外错误
  3. 冗余判断逻辑:代码中重复判断同一个链接条件,无实际意义

修复后的代码

const { Client, GatewayIntentBits, Collection } = require('discord.js');
const config = require('./config');

const bot = new Client({ 
    intents: [3276799]
});

bot.commands = new Collection()

require('./src/Structure//Handler/Event')(bot);
require('./src/Structure//Handler/Command')(bot);

bot.on('presenceUpdate', async (oldPresence, newPresence) => {
    // 先校验核心对象是否存在
    if (!newPresence.guild || !newPresence.member) return;
    
    const roleId = "1048286446345261137";
    const role = newPresence.guild.roles.cache.get(roleId);
    // 角色不存在则直接退出
    if (!role) return;

    const member = newPresence.member;
    const hasRole = member.roles.cache.has(roleId);
    const targetLink = ".gg/slayde";
    
    // 检查活动状态是否包含目标链接
    let hasTargetLink = false;
    if (newPresence.activities.length > 0) {
        const activity = newPresence.activities[0];
        // 确保state存在再判断
        if (activity.state && activity.state.includes(targetLink)) {
            hasTargetLink = true;
        }
    }

    // 根据结果添加/移除角色
    if (hasTargetLink && !hasRole) {
        await member.roles.add(role);
    } else if (!hasTargetLink && hasRole) {
        await member.roles.remove(role);
    }
})

bot.login(config.clients.token);

修复说明

  • 增加了newPresence.guild、newPresence.member、role的空值校验,避免无效操作
  • 对activity.state做了非空判断后再调用includes,彻底解决空值读取错误
  • 优化逻辑:先判断用户是否已拥有角色,再执行添加/移除操作,减少冗余API调用
  • 提取目标链接和角色ID为变量,便于后续维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:45:36