You need to enable JavaScript to run this app. Discord.js Commando 表情反应触发嵌入消息更新报错咨询
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js Commando 表情反应触发嵌入消息更新报错咨询

问题现象

基于discord.js-commando框架开发自定义命令时,执行发送嵌入消息、附加表情反应的交互逻辑,控制台抛出报错TypeError: message.clearReactions is not a function,附带对应报错界面截图,无法实现“命令发起者点击指定表情后,自动更新嵌入消息内容”的预期功能。

根因定位
  • 作用域变量重名覆盖:在channel.send(embed)的Promise回调中,将send返回的机器人发送的目标消息对象直接重命名为message,覆盖了run方法入参中代表“用户触发命令的原始消息”的变量引用,引发连锁错误:
    • 调用不存在的实例方法:discord.js v13及以上版本中,Message实体本身不提供clearReactions()方法,批量清除反应的能力已迁移到消息内置的ReactionManager实例下,对应方法为removeAll(),原代码的调用方式完全不匹配当前版本的API定义,直接触发类型报错。
    • 消息编辑路径错误:原代码编写的message.channel.edit(embed)存在本质逻辑偏差——频道对象没有消息编辑权限,编辑嵌入内容的方法是消息实体自带的能力,正确调用主体是机器人发送的目标消息对象。
    • 反应收集规则失效:过滤条件中的user.id === message.author.id,因变量被重写,此时的message已经是机器人自身发送的消息,其author字段对应机器人账号,该条件永远无法匹配真实用户的操作,即使没有报错,也无法正常触发消息更新流程。
  • 版本API适配问题:discord.js v13及以上版本中,发送、编辑消息时的嵌入参数需要包裹在embeds数组中,直接传递单个MessageEmbed实例的写法已被废弃,会引发参数类型错误。
修复后的可运行代码
const { Command } = require('discord.js-commando');
const { MessageEmbed } = require('discord.js');

module.exports = class TestCommand extends Command {
  constructor(client) {
    super(client, {
      name: 'test',
      group: 'asd',
      memberName: 'test',
      description: 'hehe',
      throttling: {
        usages: 1,
        duration: 5
      }
    });
  }

  async run(triggerMessage, args) {
    // 构造初始嵌入消息
    const initialEmbed = new MessageEmbed()
      .setTitle('Messaged testing')
      .setColor("#5d62ff")
      .setDescription('Test embed')
      .setTimestamp();

    try {
      // 发送初始嵌入消息,用sentMsg特指机器人发送的目标消息,避免变量重名覆盖
      const sentMsg = await triggerMessage.channel.send({ embeds: [initialEmbed] });
      // 为目标消息附加指定表情反应
      await sentMsg.react('➡️');
      
      // 修正过滤规则:仅匹配命令发起者对指定表情的点击行为
      const filter = (reaction, user) => 
        reaction.emoji.name === '➡️' && user.id === triggerMessage.author.id;
      // 创建反应收集器,设置1.5s有效交互时长
      const collector = sentMsg.createReactionCollector(filter, { time: 1500 });

      collector.on('collect', async () => {
        // 批量清除消息上的所有反应,使用当前版本的正确API
        await sentMsg.reactions.removeAll();
        // 构造更新后的嵌入消息内容
        const updatedEmbed = new MessageEmbed()
          .setColor('#007FFF')
          .setDescription('Test #2');
        // 直接对目标消息调用edit方法完成内容更新
        await sentMsg.edit({ embeds: [updatedEmbed] });
        // 完成交互后主动关闭收集器,避免不必要的资源占用
        collector.stop();
      });
    } catch (err) {
      console.error('命令执行异常:', err);
    }
  }
};
核心改动点说明
  • 重命名容易引发覆盖的变量,明确区分“用户触发命令的原始消息对象triggerMessage”、“机器人发送的待交互消息对象sentMsg”,从根源上解决变量引用混乱的问题。
  • 替换不存在的clearReactions()方法为版本适配的sentMsg.reactions.removeAll(),解决TypeError类型报错。
  • 修正消息编辑的调用逻辑,从错误的频道对象调用路径,调整为直接在目标消息实体上调用edit()方法,同时适配v13+版本的嵌入消息传参格式,将Embed对象包裹在embeds数组中传递。
  • 修正反应收集的过滤规则,确保只有命令发起者的点击操作会触发更新逻辑,避免其他用户的交互干扰预期流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 12:06:02