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

Discord机器人二次执行命令报错DiscordAPIError[10062]如何修复?

解决Discord机器人的Unknown interaction错误(DiscordAPIError[10062])

问题描述

我编写了一段Discord机器人代码,首次执行命令时一切正常,但第二次执行时出现错误:DiscordAPIError[10062]: Unknown interaction,请问该如何修复?

核心代码

run: async (client, interaction, message, members) => {
    if (interaction.options.getSubcommand() === 'set') {
        const channelsend = interaction.options.getChannel('channel')
        db.query(`SELECT * FROM logssystem WHERE guildid = ('${interaction.guild.id}')`, function (err, result, fields) {
            if (err) throw err;
            if (result.length  <= 0) {
                const embedok = new EmbedBuilder()
                .setDescription(`Система логирования включена в канале ${channelsend}.`)
                .setColor('Green')
                .setTimestamp()
                .setFooter({text: "Scared system", iconURL: 'https://i.imgur.com/mO4spcx.jpeg'})
                interaction.reply({embeds:[embedok], ephemeral: true})
                db.query(`INSERT INTO logssystem (guildId, logsChannel) VALUES ('${interaction.guild.id}', ${channelsend.id})`);
                console.log(`The guild ${interaction.guild.name} has enabled the logs system`)
            } else {
                const embedgived = new EmbedBuilder()
                .setDescription(`Система логирования уже включена в канале ${channelsend}.`)
                .setColor('Orange')
                
                .setFooter({text: "Scared system", iconURL: 'https://i.imgur.com/mO4spcx.jpeg'})
                interaction.reply({embeds:[embedgived], ephemeral: true})
            }})
    }
}

修复方案

1. 解决交互超时问题

Discord强制要求交互必须在3秒内完成响应,你当前使用的回调式db.query如果数据库查询耗时过长(第二次执行时可能因连接或数据量问题变慢),会导致交互过期,触发Unknown interaction错误。

改成async/await写法,同时先发送临时响应(deferReply)避免超时:

run: async (client, interaction, message, members) => {
    if (interaction.options.getSubcommand() === 'set') {
        try {
            const channelsend = interaction.options.getChannel('channel')
            // 先发送临时响应,告知用户正在处理
            await interaction.deferReply({ ephemeral: true });

            // 用await执行数据库查询,替代回调
            const [result] = await db.promise().query(`SELECT * FROM logssystem WHERE guildid = ?`, [interaction.guild.id]);

            if (result.length <= 0) {
                const embedok = new EmbedBuilder()
                    .setDescription(`Система логирования включена в канале ${channelsend}.`)
                    .setColor('Green')
                    .setTimestamp()
                    .setFooter({text: "Scared system", iconURL: 'https://i.imgur.com/mO4spcx.jpeg'});
                
                // 编辑临时响应,替换为最终结果
                await interaction.editReply({ embeds: [embedok] });
                await db.promise().query(`INSERT INTO logssystem (guildId, logsChannel) VALUES (?, ?)`, [interaction.guild.id, channelsend.id]);
                console.log(`The guild ${interaction.guild.name} has enabled the logs system`);
            } else {
                const embedgived = new EmbedBuilder()
                    .setDescription(`Система логирования уже включена в канале ${channelsend}.`)
                    .setColor('Orange')
                    .setFooter({text: "Scared system", iconURL: 'https://i.imgur.com/mO4spcx.jpeg'});
                
                await interaction.editReply({ embeds: [embedgived] });
            }
        } catch (err) {
            console.error(err);
            // 出错时也要响应交互,避免残留过期请求
            await interaction.editReply({ content: '执行命令时发生错误,请稍后重试', ephemeral: true });
        }
    }
}

2. 避免重复响应与异常处理

  • 确保每个交互只会被响应一次,检查机器人代码中是否有其他逻辑会处理同一个交互请求
  • 必须添加异常捕获(try/catch),否则数据库查询出错时会直接抛出异常,导致交互未被响应,后续请求会触发错误

3. 修复SQL注入风险(重要)

你当前的代码直接将服务器ID拼接到SQL语句中,存在严重的SQL注入风险,必须改用参数化查询(上面的修复代码已经使用了?作为占位符),避免恶意输入破坏数据库。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:27