点击按钮编辑Discord机器人回复时触发INTERACTION_NOT_REPLIED错误及deferReply使用疑问
解决Discord机器人的交互回复错误与延迟回复问题
咱们先拆解你遇到的两个核心问题,一步步来解决:
1. 按钮点击时的INTERACTION_NOT_REPLIED错误
这个报错的本质是:按钮交互是一个独立的新交互会话,你还没对它做任何回复/延迟处理,就直接调用了editReply。editReply的作用是编辑当前交互自己已经发送的回复,而按钮交互本身还没有任何回复记录,自然会触发错误。
根据你的需求,分两种场景修正:
- 如果你想更新原来那条带按钮的命令消息:用
interaction.update()替代editReply,它专门用来更新触发交互的原始消息(也就是按钮所在的消息)。 - 如果你想给按钮点击单独发一条新回复:需要先调用
reply或deferReply初始化回复状态,再进行编辑。
修正后的完整代码示例
client.on("interactionCreate", async interaction => { // 先过滤非命令和非按钮的交互,同时修正isCommand的语法(漏了括号) if (!interaction.isCommand() && !interaction.isButton()) return; if (interaction.isButton()) { if(interaction.customId === 'EDIT'){ // 场景1:更新原按钮所在的消息,可选择移除按钮或保留 await interaction.update({ content: "You clicked the button.", components: [] // 传空数组移除按钮,要保留就填原AslashButton }); // 场景2:给按钮点击单独发临时回复(二选一即可) // await interaction.reply({ content: "You clicked the button.", ephemeral: true }); }; return; // 处理完按钮后跳出,避免执行后面的命令逻辑 } const { commandName } = interaction if (commandName === "button"){ const AslashButton = new Discord.MessageActionRow().addComponents( new Discord.MessageButton() .setCustomId('EDIT') .setLabel('Button') .setStyle('PRIMARY') .setDisabled(false) ); await interaction.reply({ content: "Button.", components: [AslashButton], ephemeral: true }) }; })
2. 自定义deferReply的默认提示
调用deferReply时显示的[机器人名称] is thinking...是Discord的默认提示,你可以通过两种方式修改或替换它:
- 方式一:直接自定义延迟提示文本
调用deferReply时传入content参数,就能替换默认内容:// 发送自定义的延迟提示,同时设置为临时消息 await interaction.deferReply({ content: "正在处理你的请求,请稍候...", ephemeral: true }); - 方式二:延迟后用最终内容替换提示
先发送默认延迟提示,等耗时操作完成后,用editReply替换成最终回复:await interaction.deferReply({ ephemeral: true }); // 模拟耗时任务(比如API请求、数据库查询) await new Promise(resolve => setTimeout(resolve, 3000)); // 替换延迟提示为最终内容 await interaction.editReply({ content: "处理完成!你点击了按钮。" });
关键注意事项
- 所有交互相关的异步操作(
reply/deferReply/update)都要加await,避免因异步顺序混乱导致的错误。 - 处理按钮交互后记得加
return,防止代码继续执行到命令逻辑部分。 - 明确区分
editReply和update:前者编辑当前交互自己的回复,后者更新触发交互的原始消息。
内容的提问来源于stack exchange,提问作者Denver
相关产品推荐
相关产品推荐

