Discord.js 13.8.1按钮交互报错:如何延迟回复或避免失败?
解决Discord按钮交互"This interaction failed"报错的方法
原因分析
Discord要求所有交互(比如按钮点击)必须在3秒内得到响应,如果超出时间未处理就会触发该报错。你的代码仅编辑了指定消息,但未对按钮交互本身做出任何响应,因此导致报错。
方案一:用deferUpdate()静默标记交互已处理(推荐)
如果按钮是附在某条消息上的,且不需要发送新回复,直接调用interaction.deferUpdate()即可。这个方法会告诉Discord“我会稍后处理这条消息相关的交互”,不会发送任何可见内容,同时能避免报错。
修改后的代码:
// 先标记交互已接收,避免报错 await interaction.deferUpdate(); // 执行编辑指定消息的逻辑 interaction.channel.messages.fetch(/* 按钮自定义ID中的消息ID */).then(async ms => { return ms.edit({ content: '编辑后的消息内容' }); });
方案二:用临时回复后删除(适合非消息组件的按钮)
如果按钮不是附在目标消息上的,可以先发送一条仅自己可见的临时回复,再马上删除,同样能避免报错:
// 发送临时回复(仅自己可见) const tempReply = await interaction.reply({ content: '处理中...', ephemeral: true }); // 执行编辑消息逻辑 await interaction.channel.messages.fetch(/* 消息ID */).then(async ms => { await ms.edit({ content: '编辑后的消息内容' }); }); // 删除临时回复 await tempReply.delete();
注意事项
- 所有与交互相关的方法(比如
deferUpdate、reply)都需要用await确保异步执行顺序,避免逻辑混乱。 - 如果编辑操作耗时可能超过3秒,必须先调用
defer类方法,否则依然会触发报错。
内容的提问来源于stack exchange,提问作者Casey Squeens
相关产品推荐
相关产品推荐

