Modal窗口无法关闭求助:修复重复执行命令及后续报错问题
解决Modal窗口关闭时的报错与命令重复执行问题
你的问题核心在于当前代码错误地将用户手动关闭Modal的行为归类为超时,且未正确清理交互收集器,导致后续Modal交互冲突、命令重复执行。以下是修复后的代码及关键说明:
修复后的代码
let modalSubmitInteraction; // 显式创建收集器,便于手动控制生命周期 const collector = interaction.createModalSubmitCollector({ filter: (i) => { console.log("等待Modal提交"); console.log(i.fields); return true; }, time: 30000, }); try { modalSubmitInteraction = await collector.next(); } catch (error) { // 处理收集器触发的错误 if (error.code === "InteractionCollectorError") { // 用户手动关闭Modal的场景 if (error.message.includes("userCancel")) { console.log("用户关闭了Modal窗口"); // 确保对原交互给出反馈,避免"未知交互"报错 if (!interaction.replied && !interaction.deferred) { await interaction.reply({ content: "操作已取消", ephemeral: true }); } else if (!interaction.replied) { await interaction.editReply({ content: "操作已取消" }); } return; } // 超时场景 else if (error.message === "timeout") { if (!interaction.replied && !interaction.deferred) { await interaction.followUp({ content: "Modal提交超时,请重试", ephemeral: true, }); } else { await interaction.editReply({ content: "Modal提交超时,请重试" }); } return; } } else { console.error("等待Modal时发生意外错误:", error); // 兜底错误反馈 if (!interaction.replied && !interaction.deferred) { await interaction.reply({ content: "发生未知错误,请重试", ephemeral: true }); } } } finally { // 无论成功失败,强制清理收集器,避免残留影响后续交互 if (!collector.ended) { collector.stop("cleanup"); } }
关键修复点
- 准确区分关闭与超时:通过
error.message.includes("userCancel")识别用户手动关闭Modal的行为,不再和超时混淆 - 显式管理收集器生命周期:改用
createModalSubmitCollector创建收集器,并在finally块中强制停止,避免残留的收集器干扰后续Modal交互 - 完善交互反馈逻辑:针对原交互的状态(已回复/未回复/已延迟)做不同处理,防止出现"未知交互"报错
- 严谨终止流程:每个错误分支都通过
return终止后续代码执行,避免命令重复触发
内容的提问来源于stack exchange,提问作者Flipdanger
相关产品推荐
相关产品推荐

