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
相关产品推荐
相关产品推荐

