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

Discord JS中reaction.emoji返回undefined问题求助

解决Discord.js中messageReactionAdd事件里reaction.emoji返回undefined的问题

我之前也碰到过一模一样的坑!大概率是因为你处理的是Partial(部分)对象,Discord.js 在特定场景下不会返回完整的 Reaction 对象,直接访问emoji属性自然会拿到undefined。

问题根源

当你的机器人启动后,对于那些机器人上线前就存在的消息,如果有人给这些消息添加反应,Discord 只会发送一个「精简版」的 Reaction 对象(也就是 Partial 对象)——这个对象只包含最基础的标识信息,像emoji这类详细属性并没有被加载,所以直接访问就会得到undefined。

解决方案

分两步就能搞定:

  1. 创建 Client 时启用 Partial 支持
    首先初始化机器人客户端时,必须声明要支持的 Partial 类型,不然机器人根本不会处理 Partial 对象的事件:

    const Discord = require('discord.js');
    const client = new Discord.Client({
      partials: ['MESSAGE', 'CHANNEL', 'REACTION', 'USER'] // 必须包含这几个类型
    });
    
  2. 在事件处理中检查并获取完整的 Reaction 对象
    在messageReactionAdd事件里,先判断当前 Reaction 是否是 Partial 对象,如果是,就调用fetch()方法拉取完整数据:

    client.on('messageReactionAdd', async (reaction, user) => {
      // 先处理 Partial 对象
      if (reaction.partial) {
        try {
          await reaction.fetch(); // 获取完整的 Reaction 数据
        } catch (err) {
          console.error('无法获取完整的 Reaction 对象:', err);
          return; // 获取失败就直接退出,避免后续报错
        }
      }
      // 现在就能正常访问 emoji 属性了
      console.log(reaction.emoji);
      // 如果是自定义表情,还能访问它的 id、name 等属性,比如 reaction.emoji.id、reaction.emoji.name
    });
    

这样处理后,不管是新消息的反应还是旧消息的反应,你都能正确拿到emoji对象了。

内容的提问来源于stack exchange,提问作者Vanerac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:15:42