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

Discord.js v13按钮模态框报错INTERACTION_ALREADY_REPLIED求助

解决Discord.js v13模态框提交时的INTERACTION_ALREADY_REPLIED错误

问题描述

使用Discord.js v13开发按钮触发模态框功能,提交模态框后出现以下错误:

Error [INTERACTION_ALREADY_REPLIED]: The reply to this interaction has already been sent or deferred.

尝试过await interaction.deferUpdate()和await interaction.reply(),但问题未解决。

错误原因

代码中处理模态框提交时,先调用了interaction.deferUpdate(),之后又调用interaction.reply()。这两个操作均针对同一个模态框提交交互:

  • deferUpdate()会将交互标记为"已延迟响应",占用了该交互的唯一响应名额
  • 后续调用reply()时,Discord检测到该交互已被响应/延迟,因此抛出错误

解决方案

根据需求选择以下两种方案之一:

方案1:直接即时回复

删除await interaction.deferUpdate(),直接使用interaction.reply()发送回复(你的场景中回复是即时的,无需延迟)。

修改后的核心代码片段:

if (interaction.isModalSubmit()) {
  // 移除这一行:await interaction.deferUpdate();
  if (interaction.customId === 'partnerego') {
    let bravo = new Discord.MessageEmbed()
      .setTitle('🤝 **__Partnership Eseguita__** 🤝')
      .setDescription(
        `<a:verifygreen:1084425754554683402> _Eseguita correttamente in_ <#1091772739632763010>`,
      )
      .setColor('#0003ff')
      .setFooter(
        `${interaction.guild.name} | ` + currentDate.toLocaleString(),
        `https://cdn.discordapp.com/attachments/1084380772774985728/1084382176092635197/48115234-6DB0-400F-BA6C-681106447C87.png`,
      );
    await interaction.reply({ embeds: [bravo], ephemeral: true });

    // 后续逻辑保持不变
    const invito = interaction.fields.getTextInputValue('invito');
    const partnerato = interaction.fields.getTextInputValue('partnerato');
    let partnermb = new Discord.MessageEmbed()
      .setTitle('🤝 **__Partnership Eseguita__** 🤝')
      .setDescription(
        `<a:verifygreen:1084425754554683402> _Eseguita correttamente
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
> Eseguita da ${interaction.member.toString()}
> Eseguita con_ ${partnerato}
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬`,
      )
      .setColor('#0003ff')
      .setFooter(
        `${interaction.guild.name} | ` + currentDate.toLocaleString(),
        `https://cdn.discordapp.com/attachments/1084380772774985728/1084382176092635197/48115234-6DB0-400F-BA6C-681106447C87.png`,
      );
    client.channels.cache.get('1091772739632763010').send(`${invito}`);
    setTimeout(() => {
      client.channels.cache
        .get('1091772739632763010')
        .send({ embeds: [partnermb] });
    }, 2300);
  }
}

方案2:延迟回复(适用于耗时异步操作)

如果代码中有耗时的异步操作(如数据库查询),可使用interaction.deferReply()代替deferUpdate(),后续用interaction.editReply()编辑回复:

if (interaction.isModalSubmit()) {
  await interaction.deferReply({ ephemeral: true }); // 延迟回复,标记为临时消息
  if (interaction.customId === 'partnerego') {
    // 此处可执行耗时操作
    let bravo = new Discord.MessageEmbed()
      // 嵌入内容保持不变
    await interaction.editReply({ embeds: [bravo] });

    // 后续逻辑保持不变
  }
}

关键说明

  • deferUpdate()仅适用于更新原交互消息(如按钮所在的消息)的场景,模态框提交交互无对应原消息需更新,因此不适用。
  • 每个Discord交互仅能被响应一次:要么直接reply(),要么先deferReply()再editReply(),不可同时执行两种响应操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:33:16