Discord机器人报错DiscordAPIError[40060]但仍正常运行,求解原因
解决DiscordAPIError[40060]: Interaction has already been acknowledged错误
错误原因
这个报错是因为Discord对slash命令的交互有3秒超时限制:如果你的命令逻辑(比如这里的users.all()数据库查询)执行时间超过3秒,Discord会自动标记该交互已被处理,后续再调用interaction.reply()就会触发这个错误。虽然机器人最终可能还是能完成操作,但Discord的交互机制已经判定超时,所以抛出了这个异常。
修复方案
在执行耗时操作(比如数据库查询)前,先调用interaction.deferReply()告知Discord“稍后会回复”,这样可以把交互超时时间延长到15分钟,等操作完成后再用interaction.editReply()替换初始的加载提示。
修改后的代码如下:
const { SlashCommandBuilder } = require('discord.js'); const { QuickDB } = require('quick.db'); const db = new QuickDB(); const users = db.table('users'); module.exports = { data: new SlashCommandBuilder() .setName('manager') .setDescription('获取管理信息。'), async execute(interaction) { // 先发送延迟回复,申请更长处理时间 await interaction.deferReply(); // 执行数据库查询,获取users表的所有数据(返回数组) const userList = await users.all(); // 格式化返回内容,根据需求调整 let replyContent = '你已进入管理界面!\n'; if (userList.length > 0) { replyContent += `当前用户数据共${userList.length}条:\n`; userList.forEach((item, idx) => { replyContent += `${idx+1}. 用户ID: ${item.id},数据: ${JSON.stringify(item.value)}\n`; }); } else { replyContent += '暂无用户数据。'; } // 替换延迟回复为实际内容 await interaction.editReply(replyContent); }, };
额外说明
users.all()本身就会返回数组格式的结果,直接用变量接收后即可遍历、处理这些数据。- 如果不想让其他成员看到回复,可以在
deferReply时添加参数:await interaction.deferReply({ ephemeral: true }),这样只有命令发起者能看到内容。
内容的提问来源于stack exchange,提问作者Wylie Coyote
相关产品推荐
相关产品推荐

