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

点击按钮编辑Discord机器人回复时触发INTERACTION_NOT_REPLIED错误及deferReply使用疑问

解决Discord机器人的交互回复错误与延迟回复问题

咱们先拆解你遇到的两个核心问题,一步步来解决:

1. 按钮点击时的INTERACTION_NOT_REPLIED错误

这个报错的本质是:按钮交互是一个独立的新交互会话,你还没对它做任何回复/延迟处理,就直接调用了editReply。editReply的作用是编辑当前交互自己已经发送的回复,而按钮交互本身还没有任何回复记录,自然会触发错误。

根据你的需求,分两种场景修正:

  • 如果你想更新原来那条带按钮的命令消息:用interaction.update()替代editReply,它专门用来更新触发交互的原始消息(也就是按钮所在的消息)。
  • 如果你想给按钮点击单独发一条新回复:需要先调用reply或deferReply初始化回复状态,再进行编辑。

修正后的完整代码示例

client.on("interactionCreate", async interaction => { 
  // 先过滤非命令和非按钮的交互,同时修正isCommand的语法(漏了括号)
  if (!interaction.isCommand() && !interaction.isButton()) return;

  if (interaction.isButton()) { 
    if(interaction.customId === 'EDIT'){ 
      // 场景1:更新原按钮所在的消息,可选择移除按钮或保留
      await interaction.update({ 
        content: "You clicked the button.", 
        components: [] // 传空数组移除按钮,要保留就填原AslashButton
      });
      // 场景2:给按钮点击单独发临时回复(二选一即可)
      // await interaction.reply({ content: "You clicked the button.", ephemeral: true });
    };
    return; // 处理完按钮后跳出,避免执行后面的命令逻辑
  } 

  const { commandName } = interaction 
  if (commandName === "button"){ 
    const AslashButton = new Discord.MessageActionRow().addComponents( 
      new Discord.MessageButton() 
        .setCustomId('EDIT') 
        .setLabel('Button') 
        .setStyle('PRIMARY') 
        .setDisabled(false) 
    ); 
    await interaction.reply({ content: "Button.", components: [AslashButton], ephemeral: true }) 
  }; 
})

2. 自定义deferReply的默认提示

调用deferReply时显示的[机器人名称] is thinking...是Discord的默认提示,你可以通过两种方式修改或替换它:

  • 方式一:直接自定义延迟提示文本
    调用deferReply时传入content参数,就能替换默认内容:
    // 发送自定义的延迟提示,同时设置为临时消息
    await interaction.deferReply({ content: "正在处理你的请求,请稍候...", ephemeral: true });
    
  • 方式二:延迟后用最终内容替换提示
    先发送默认延迟提示,等耗时操作完成后,用editReply替换成最终回复:
    await interaction.deferReply({ ephemeral: true });
    // 模拟耗时任务(比如API请求、数据库查询)
    await new Promise(resolve => setTimeout(resolve, 3000));
    // 替换延迟提示为最终内容
    await interaction.editReply({ content: "处理完成!你点击了按钮。" });
    

关键注意事项

  • 所有交互相关的异步操作(reply/deferReply/update)都要加await,避免因异步顺序混乱导致的错误。
  • 处理按钮交互后记得加return,防止代码继续执行到命令逻辑部分。
  • 明确区分editReply和update:前者编辑当前交互自己的回复,后者更新触发交互的原始消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:52:38