Discord.js反应计数过滤器恒返回1 计分结果始终为0问题求助
问题根因
该问题和缓存机制无关,是对MessageReaction对象属性的误用导致:
m.reactions.cache是按emoji分类的集合,同一种emoji不管有多少用户添加反应,在集合中只会存在1条MessageReaction条目,所以filter后的size只能返回0或1,和实际投票人数无关- 单个emoji的总投票数存储在对应
MessageReaction条目下的count属性中,你需要读取该属性获取真实数值
修复后代码
client.calcscore = async function(m) { //m is an instance of Message if(m.partial) await m.fetch() const upvoteReaction = m.reactions.cache.find(r => r.emoji.name === '⬆️') const upvotes = upvoteReaction ? upvoteReaction.count : 0 const downvoteReaction = m.reactions.cache.find(r => r.emoji.name === '⬇️') const downvotes = downvoteReaction ? downvoteReaction.count : 0 return upvotes - downvotes }
可选优化&排查项
- 用
find替代filter筛选反应条目,匹配到目标emoji后就会终止遍历,性能更高 - 若修复后仍然存在计数不准的情况,可按以下顺序排查:
- 确认机器人已被授予
GUILD_MESSAGE_REACTIONS权限,缺少该权限会导致反应数据无法同步 - 确认机器人拥有对应频道的「查看历史消息」权限,否则无法读取完整反应列表
- 若你开启了discord.js的精简缓存模式,可在读取计数前手动拉取最新反应数据:
if (upvoteReaction) await upvoteReaction.fetch() if (downvoteReaction) await downvoteReaction.fetch() - 排除事件触发时序问题:reaction添加/移除事件触发时缓存可能还未更新,可给调用逻辑加50ms左右的短延迟验证
- 确认机器人已被授予
内容的提问来源于stack exchange,提问作者MrMythical
相关产品推荐
相关产品推荐

