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

Discord.js v13使用presenceUpdate事件报'activities'为null TypeError如何解决

报错修复与功能实现方案

报错根因

  • Discord.js v13的presenceUpdate事件返回的两个参数为旧Presence实例、新Presence实例,当用户无历史在线状态缓存时,旧Presence会返回null,直接访问null下的activities属性就会触发该类型错误。
  • 使用可选链操作符提前判空即可避免该问题,同时需要注意客户端初始化时必须开启GUILD_PRESENCES、GUILDS、GUILD_MEMBERS网关权限,否则无法正常接收presenceUpdate事件。

适配开播触发身份组分配的修正代码

const client = require('../index')

client.on('presenceUpdate', function(oldPresence, newPresence) {
    // 过滤机器人、无服务器信息的异常情况
    if (newPresence.user?.bot || !newPresence.guild) return;
    
    const guild = newPresence.guild;
    const streamingRole = guild.roles.cache.find(role => role.name === 'Fazendo Live');
    // 对应身份组不存在时直接返回避免后续报错
    if (!streamingRole) return;

    // 判断是否处于开播状态,开播对应activity类型为STREAMING
    const oldStreaming = oldPresence?.activities ? oldPresence.activities.find(activity => activity.type === 'STREAMING') : false;
    const newStreaming = newPresence.activities ? newPresence.activities.find(activity => activity.type === 'STREAMING') : false;

    // 用户开始开播,添加对应身份组
    if (!oldStreaming && newStreaming) {
      newPresence.member.roles.add(streamingRole)
        .then(() => console.log(`${streamingRole.name} added to ${newPresence.user.tag}.`))
        .catch(console.error);
    } 

    // 用户结束开播,移除对应身份组
    else if (oldStreaming && !newStreaming) {
      newPresence.member.roles.remove(streamingRole)
        .then(() => console.log(`${streamingRole.name} removed from ${newPresence.user.tag}.`))
        .catch(console.error);
    }
});

可选调整说明

  • 若需要测试游戏启动触发的逻辑,只需把上述代码中activity.type的判断值从STREAMING改回PLAYING即可。
  • 可以在开头的判断逻辑中按需加入移动端过滤、状态变更过滤的规则。

内容的提问来源于stack exchange,提问作者Otávio Quirino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:24:02