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

