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

Discord.js v13随机报错:Cannot read properties of undefined (reading 'cache')

Discord.js v13 多机器人运行时随机触发ThreadMemberUpdate内部错误

问题详情

在同一脚本中遍历机器人令牌创建多个Discord客户端并监听所有事件,本地开发环境无异常,但生产服务器上频繁触发Discord.js内部错误,报错位置为node_modules/discord.js/src/client/actions/ThreadMemberUpdate.js:12。

错误代码片段

class ThreadMemberUpdateAction extends Action {
  handle(data) {
    const client = this. Client; // 注意此处存在空格,可能是属性读取错误的诱因
    // Discord sends the thread id as id in this object
    const thread = client.channels.cache.get(data.id);
    //           错误触发位置指向此处
    if (thread) {
      const member = thread.members.cache.get(data.user_id);
      if (!member) {
        const newMember = thread.members._add(data);
        return { newMember };
      }
      const old = member._update(data);
      client.emit(Events.THREAD_MEMBER_UPDATE, old, member);
    }
    return {};
  }
}

环境配置

OS: Ubuntu 20.04.4 LTS
Node.JS Version: v10.19.0
Discord.JS Version: 13.15.1

核心原因分析

  1. Node.js版本严重不兼容:Discord.js v13官方要求Node.js最低版本为v16.6.0,v10.19.0属于过时版本,对ES6+异步特性、Promise处理的支持存在缺陷,多客户端并发运行时极易触发异步逻辑错误。
  2. 单进程多客户端资源冲突:同一进程内运行多个Discord客户端会共享事件循环、缓存资源,可能导致线程数据缓存未同步时就触发ThreadMemberUpdate事件,进而出现缓存查找失败的异常。
  3. 生产环境网络延迟影响:生产服务器与Discord API的网络延迟高于本地,事件到达时客户端缓存尚未完成同步,加剧了缓存缺失的概率。

解决方案

  • 强制升级Node.js版本:将Node.js升级至v16.6.0及以上版本,这是解决Discord.js v13兼容性问题的基础。
  • 隔离多客户端进程:使用PM2等进程管理器为每个机器人单独创建进程,避免单进程内的资源竞争与事件冲突。
  • 修正代码拼写错误:若报错是由于this. Client的空格导致属性读取失败,需修正为this.client(小写c),不过此问题更可能是Discord.js内部已修复的bug,升级Node版本后可同步规避。
  • 添加缓存容错处理:在监听threadMemberUpdate事件时,手动检查线程缓存是否存在,避免因缓存缺失导致后续逻辑崩溃:
    client.on('threadMemberUpdate', (oldMember, newMember) => {
      if (!newMember?.thread) return;
      // 后续业务逻辑
    });
    

内容的提问来源于stack exchange,提问作者Light Yagami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:12:44