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
核心原因分析
- Node.js版本严重不兼容:Discord.js v13官方要求Node.js最低版本为v16.6.0,v10.19.0属于过时版本,对ES6+异步特性、Promise处理的支持存在缺陷,多客户端并发运行时极易触发异步逻辑错误。
- 单进程多客户端资源冲突:同一进程内运行多个Discord客户端会共享事件循环、缓存资源,可能导致线程数据缓存未同步时就触发
ThreadMemberUpdate事件,进而出现缓存查找失败的异常。 - 生产环境网络延迟影响:生产服务器与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
相关产品推荐
相关产品推荐

