如何获取消息反应数?代码触发TypeError: Cannot read properties of null
解决获取消息反应数时的TypeError问题
错误TypeError: Cannot read properties of null (reading 'fetch')的核心原因是message.reactions.resolve()找不到对应表情的反应对象,返回了null,后续调用fetch()自然报错。以下是具体解决步骤和优化后的代码:
问题排查点
- 确认表情标识正确性:检查
SUGGESTIONS.EMOJI.UP_VOTE和DOWN_VOTE的取值是否正确。如果是自定义表情,需要使用完整的<:name:id>格式或者表情ID;如果是系统默认表情,要确保unicode编码(比如👍)拼写无误。 - 消息反应是否已加载:如果消息是从缓存中获取的,可能未完整加载所有反应,需要先调用
message.reactions.fetch()获取全部反应列表,再进行resolve操作。
优化后的代码
const getStats = async (message) => { // 先获取消息的所有反应(确保缓存中有完整数据) await message.reactions.fetch(); // 分别获取上下投票的反应对象,找不到则返回null const upReaction = message.reactions.resolve(SUGGESTIONS.EMOJI.UP_VOTE); const downReaction = message.reactions.resolve(SUGGESTIONS.EMOJI.DOWN_VOTE); // 计算票数:存在反应则取count-1(减去机器人自己的投票),不存在则为0 const upVotes = upReaction ? upReaction.count - 1 : 0; const downVotes = downReaction ? downReaction.count - 1 : 0; return [upVotes, downVotes]; };
关键改进说明
- 用
async/await替代Promise.all,代码更简洁易读。 - 先调用
message.reactions.fetch()确保所有反应都被加载到缓存,避免resolve不到的情况。 - 增加空值判断,即使某个表情没有被添加到消息上,也不会抛出错误,而是默认票数为0。
- 直接使用缓存中的
count属性,无需再次调用fetch()(因为已经通过message.reactions.fetch()获取了完整数据)。
内容的提问来源于stack exchange,提问作者Nelixus159
相关产品推荐
相关产品推荐

