
在使用discord.js的`awaitmodalsubmit`等待模态框提交时,若用户取消模态框或在等待期间重复执行命令,可能导致“interaction has already been acknowledged”错误。这是因为`awaitmodalsubmit`本身会确认交互,不当的错误处理机制可能造成重复确认。本文将详细阐述此问题的根源,并提供使用`.then()`方法处理模态框提交事件的正确姿势,以确保交互流程的健壮性与稳定性。
在开发Discord机器人时,模态框(Modal)提供了一种强大的方式来收集用户的结构化输入。Discord.js库通过interaction.showModal()显示模态框,并通过interaction.awaitModalSubmit()来等待用户的提交。然而,不正确的事件处理方式可能导致一个常见的错误:“Interaction has already been acknowledged”。
此错误通常发生在以下场景:
问题的核心在于interaction.awaitModalSubmit()方法。根据Discord.js的文档,此方法在内部已经处理了对原始命令交互的确认(acknowledgement)。这意味着一旦模态框被成功提交,或者在某些情况下,即使是超时或取消,该方法也可能已经对原始的ChatInputCommandInteraction进行了处理。如果开发者在后续的代码中再次尝试对同一个交互进行回复或确认(例如,在.catch()块中直接回复,或者当多个收集器同时触发回复时),就会抛出“Interaction has already been acknowledged”错误,因为Discord API不允许对同一个交互进行多次确认。
原始的代码示例展示了这种潜在的问题:
        await interaction.showModal(submissionValidateModal);
        const modalReply = await interaction.awaitModalSubmit({
            time: 60000,
            filter: i => i.user.id === interaction.user.id,
        }).catch(error => {
            console.log(error)
            return null; // 这里可能导致问题
        })
        // Handling Stuff
        modalReply.reply({ embeds: [requestedSentEmbed], ephemeral: true });在这个例子中,如果awaitModalSubmit因为超时或用户取消而抛出错误,.catch块会捕获它并返回null。随后,modalReply.reply()会尝试对一个可能为null或者已经处理过的交互进行回复,这进一步增加了出错的可能性。更重要的是,即使没有显式错误,如果存在多个收集器,当模态框提交时,它们都会尝试处理并回复,导致重复确认。
解决此问题的关键在于正确理解awaitModalSubmit的工作机制,并利用其返回的Promise。由于awaitModalSubmit本身会确认命令交互,我们应该使用.then()方法来处理成功的模态框提交,并使用.catch()方法来处理超时或其他错误。这种模式确保了只有在模态框成功提交并返回一个有效的ModalSubmitInteraction时,我们才尝试进行后续的回复操作,并且避免了重复确认。
以下是推荐的解决方案:
        await interaction.showModal(submissionValidateModal);
        // 使用 .then() 处理模态框提交成功,使用 .catch() 处理超时或错误
        interaction.awaitModalSubmit({
            time: 60000, // 模态框提交的等待时间,例如60秒
            filter: i => i.user.id === interaction.user.id, // 确保只有发起命令的用户才能提交
        })
        .then(modalInteraction => {
            // 模态框成功提交后执行的逻辑
            // modalInteraction 是一个 ModalSubmitInteraction 对象
            // 此时,原始的 ChatInputCommandInteraction 已经被 awaitModalSubmit 确认
            // 我们可以直接使用 modalInteraction 进行回复或后续处理
            // 示例:获取模态框输入数据
            const inputField1 = modalInteraction.fields.getTextInputValue('customIdOfInputField1');
            const inputField2 = modalInteraction.fields.getTextInputValue('customIdOfInputField2');
            // 进行业务逻辑处理...
            // 回复模态框提交交互
            modalInteraction.reply({
                embeds: [requestedSentEmbed],
                ephemeral: true
            });
        })
        .catch(error => {
            // 处理模态框超时、用户取消或其他错误
            // 注意:在这种情况下,awaitModalSubmit 已经处理了原始交互的确认
            // 因此,这里不应尝试对原始的 interaction 进行 reply() 或 followUp()
            // 如果需要通知用户,可以考虑使用 interaction.followUp() (如果原始交互未被完全处理)
            // 或者直接在控制台记录错误
            console.error('模态框提交失败或超时:', error);
            // 如果需要向用户发送一个关于超时的临时消息,可以考虑:
            // 检查 error 类型,如果是 'CollectorError' 且是 'time',则可以发送提示
            if (error.code === 'CollectorError' && error.message === 'Collector timed out') {
                 // 注意:这里尝试对原始 interaction 进行 followUp,如果原始交互已经被 awaitModalSubmit 完全处理,
                 // followUp 可能会失败。更稳妥的方式是避免在此处直接回复用户,
                 // 或者确保原始交互在 awaitModalSubmit 内部处理后仍能接受 followUp。
                 // 通常,超时后,原始交互已经无法再被 reply 或 followUp。
                 // 因此,最好的做法是仅仅记录错误,不尝试再次回复用户。
                 // 如果确实需要通知用户,可能需要在模态框显示前就设置一个计时器,
                 // 或者在 awaitModalSubmit 内部的 filter 中加入超时处理逻辑。
                 // 简单起见,通常仅记录错误即可。
            }
        });通过遵循上述指导原则,开发者可以有效地避免Discord.js中模态框交互导致的“Interaction has already been acknowledged”错误,从而构建更健壮、用户体验更好的Discord机器人。
以上就是解决Discord.js中模态框取消或重复提交导致的交互已确认错误的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                 
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                            Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号