Discord.js v13定时器结束后reactions.resolve返回undefined及未知消息错误
问题排查与修复方案
错误原因定位
1. TypeError: Cannot read properties of undefined (reading 'resolve')
- 核心触发点:
cacheChannel.messages.fetch()返回的reactionMessage为空,或reactionMessage.reactions.resolve('⬆️')返回空 - 具体诱因包括:
- 线上服务器字符编码非UTF-8,导致表情符号被转码为乱码,无法匹配到对应的表情回应
- 数据库存储的
MessageID对应的消息已被删除/撤回,fetch消息操作返回空值 - 此前node版本不匹配,用npx启动时调用的node版本与依赖编译版本不一致,导致discord.js缓存读取、数据库读写异常,无法拿到正确的消息数据
2. DiscordAPIError: Unknown Message(错误码10008)
- 核心触发点:代码尝试对已不存在的消息执行添加表情、读取内容等操作,和第一个错误属于同源问题,都是目标消息无法被discord接口识别导致的报错。
修复步骤
- 先确认环境一致性
- 执行
node -v确认当前启动用的node版本确实为v92,执行npm ls sqlite3确认sqlite3的编译版本匹配当前node版本,消除依赖版本异常隐患 - 确认线上服务器系统字符集设置为UTF-8,避免表情符号被转码导致匹配失败
- 代码层面添加空值判断和错误捕获,避免未捕获异常导致机器人崩溃,参考修改后的代码:
sEmbed.awaitReactions({ filter, max: 15, time: 43200000, errors: ['time'] }) .then(async collected => { let cacheChannel = message.guild.channels.cache.get(channelID); if(!cacheChannel) return; try { const reactionMessage = await cacheChannel.messages.fetch(db.get(`${suggestionID}.MessageID`)); const upReaction = reactionMessage?.reactions?.resolve('⬆️'); if(!upReaction) { // 表情不存在/消息异常的兜底逻辑 GV.lessVotes(true, suggestionID, sEmbed, db, message, icon, discord); return; } const userList = await upReaction.users.fetch(); db.set(`${suggestionID}.Upvoted_Users`, ((userList.map((user) => user.id).length) - 1)); db.set(`${suggestionID}.Total_Users`, 15); db.set(`${suggestionID}.Downvoted_Users`, db.get(`${suggestionID}.Total_Users`) - db.get(`${suggestionID}.Upvoted_Users`)); GV.checkValues(db, suggestionID, sEmbed, message, icon, discord); } catch (err) { // 消息拉取失败的兜底逻辑 GV.lessVotes(true, suggestionID, sEmbed, db, message, icon, discord); } }) .catch(collected => { change = true; GV.lessVotes(change, suggestionID, sEmbed, db, message, icon, discord); });
- 发送消息、添加表情的逻辑也同步添加try/catch捕获10008错误,添加兜底处理逻辑
- 测试阶段可将倒计时时间临时修改为1-5分钟,不用等待12小时即可验证修复效果
内容的提问来源于stack exchange,提问作者PackOf20
相关产品推荐
相关产品推荐

