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

Discord.js中interaction.editReply与MessageComponentCollector配合失效问题

Discord.js按钮交互更新消息触发InteractionNotReplied错误

问题场景

用Discord.js开发机器人商品筛选命令,生成最多10个Embed展示在售商品,超过10件时用按钮切换上下分组。点击按钮希望更新初始消息而非发新消息,但触发错误:

Error [InteractionNotReplied]: The reply to this interaction has not been sent or deferred.

错误原因

核心问题是collect事件回调里的interaction参数和外层命令的interaction重名,导致内部代码错误地使用了命令交互对象而非按钮交互对象。另外,组件交互应该用update()方法而非editReply()——editReply()是用来修改命令的初始回复,而按钮这类组件交互需要用update()来更新挂载组件的消息。

修正后的代码

// 初始命令回复
const reply = await interaction.reply({
  embeds: embedsToDisplay,
  components: [buttonRow],
  ephemeral: true,
});

const collector = reply.createMessageComponentCollector({
  componentType: ComponentType.Button,
});

// 重命名交互参数为buttonInteraction,避免和外层重名
collector.on("collect", async (buttonInteraction) => {
  if (buttonInteraction.customId === "seeNext10Items") {
    counterOfItemTenLowerRange++;
    counterOfItemTenUpperRange++;
    seePrevious10Items.setDisabled(false);
    
    embedsToDisplay = result
      .slice(
        counterOfItemTenLowerRange * 10,
        counterOfItemTenUpperRange * 10
      )
      .map((item) => embedCreator.createEmbedResponseFilterHdv(item));

    if (counterOfItemTenUpperRange === numberOfItemDividedByTen) {
      seeNext10Items.setDisabled(true);
    }

    // 用update()更新组件所在的消息
    await buttonInteraction.update({
      embeds: embedsToDisplay,
      components: [buttonRow],
    });
    return;
  }
  
  if (buttonInteraction.customId === "seePrevious10Items") {
    counterOfItemTenLowerRange--;
    counterOfItemTenUpperRange--;
    seeNext10Items.setDisabled(false);
    
    embedsToDisplay = result
      .slice(
        counterOfItemTenLowerRange * 10,
        counterOfItemTenUpperRange * 10
      )
      .map((item) => embedCreator.createEmbedResponseFilterHdv(item));

    if (counterOfItemTenLowerRange === 0) {
      seePrevious10Items.setDisabled(true);
    }

    await buttonInteraction.update({
      embeds: embedsToDisplay,
      components: [buttonRow],
    });
    return;
  }
});

关键改动说明

  • 把collect事件里的参数从interaction改成buttonInteraction,避免变量名冲突,确保操作的是按钮的交互实例
  • 将editReply()替换为update(),这是Discord.js中组件交互更新消息的正确方法
  • 移除update()里的ephemeral参数——ephemeral只在初始回复时设置,后续更新不需要重复指定

内容的提问来源于stack exchange,提问作者Alex.A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:43:10