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

如何获取消息反应数?代码触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:40:29