Discord.js按钮点击提示“This interaction failed”但功能正常如何修复
问题根源
Discord 要求所有交互事件(包括按钮点击)必须在触发后3秒内给出响应,你当前的代码没有对按钮交互做任何响应操作,因此Discord会判定交互超时失败,弹出“This interaction failed”提示。你的功能逻辑能正常执行是因为后台异步任务不受这个超时规则影响,但前端会始终展示错误提示。
解决方案
只需给交互添加一个合法响应即可解决报错,两种可选方案:
- 不需要给用户展示操作反馈:调用
interaction.deferUpdate(),告知Discord已接收交互,无需修改原按钮消息,也不会产生额外公开内容 - 需要给触发用户发操作提示:调用
interaction.reply(),设置ephemeral: true让提示仅触发用户可见,不会公开展示在频道中
优化后完整代码
const { MessageActionRow, MessageButton, Permissions } = require('discord.js'); const { MessageEmbed } = require('discord.js') const client = require('../index') const config = require("../config.json"); client.on("interactionCreate", async (interaction) => { if (!interaction.isButton() || interaction.customId !== 'tic') return // 先响应交互,避免超时 await interaction.deferReply({ ephemeral: true }) try { // 检查是否已存在对应频道 const existChannel = interaction.guild.channels.cache.find(channel => channel.name === interaction.user.username + "-test") if (existChannel) { const warn = new MessageEmbed() .setColor("RED") .setTitle("__**test**__") .setDescription(":warning: error!") await interaction.user.send({ embeds: [warn] }) // 更新临时回复给用户提示 await interaction.editReply({ content: '你已经有专属频道了,请查看私信', embeds: [] }) return } // 等待频道创建完成,直接获取频道对象,不需要查缓存 const newChannel = await interaction.guild.channels.create(interaction.user.username + "-test", { type: "text", parent: config.categoryId, permissionOverwrites: [ { id: '887160123733184533', allow: [Permissions.FLAGS.VIEW_CHANNEL, Permissions.FLAGS.SEND_MESSAGES, Permissions.FLAGS.READ_MESSAGE_HISTORY], deny: [Permissions.FLAGS.CREATE_INSTANT_INVITE] }, { id: '759286092548538388', deny: [Permissions.FLAGS.VIEW_CHANNEL] }, { id: interaction.user.id, allow: [Permissions.FLAGS.VIEW_CHANNEL, Permissions.FLAGS.SEND_MESSAGES, Permissions.FLAGS.READ_MESSAGE_HISTORY], deny: [Permissions.FLAGS.CREATE_INSTANT_INVITE] } ] }) const del = new MessageActionRow() .addComponents( new MessageButton() .setCustomId('del') .setLabel('🗑️ delete!') .setStyle('DANGER'), ); const welcome = new MessageEmbed() .setTitle("test") .setDescription("test\n:warning: __**error**__: warn!!!") .setColor("#FF5809") // 直接用创建完成的频道对象发消息,不需要等待 await newChannel.send({ embeds: [welcome], components: [del] }) const successEmbed = new MessageEmbed() .setTitle("__**test**__") .setColor("#00DB00") .setDescription(":white_check_mark: test!") await interaction.user.send({ embeds: [successEmbed] }); // 更新临时回复告知用户操作成功 await interaction.editReply({ content: '专属频道已创建,请查看私信和频道列表', embeds: [] }) } catch (err) { console.error('操作失败:', err) await interaction.editReply({ content: '操作出现异常,请稍后再试', embeds: [] }) } })
额外注意事项
- 不要使用用户名作为频道唯一判断标识,Discord支持重复用户名,后续可以改为用用户ID拼接作为频道名,避免冲突
- 确保Bot拥有
MANAGE_CHANNELS、SEND_MESSAGES等必要权限,避免创建频道或发消息失败 - 如果不需要给用户回复任何提示,可以将
deferReply替换为await interaction.deferUpdate(),后续不需要调用editReply
内容的提问来源于stack exchange,提问作者yorukot
相关产品推荐
相关产品推荐

