Discord斜杠命令运行正常但提示interaction failed无报错如何解决?
用户提交的命令运行状态截图:
问题产生原因
Discord 斜杠命令有强制规则:服务端必须在交互触发后3秒内返回响应,否则就会弹出「interaction failed」提示。你当前的代码只执行了往频道发送 embed 的逻辑,没有给触发命令的interaction对象返回任何响应,因此就算功能实际运行成功,也会触发超时报错。
另外你代码里then回调的参数命名为interaction,会覆盖外层的交互对象,属于潜在的逻辑隐患。
修复方案
只需要在处理业务逻辑前给交互返回响应即可,你可以根据需求选择响应方式:
- 若需要给发起命令的用户反馈,返回仅对方可见的消息即可
- 若不需要给用户任何可见提示,可以先延迟响应再删除回复,Discord 就不会弹出报错
修复后的参考代码:
const { SlashCommandBuilder } = require("@discordjs/builders"); const { MessageEmbed } = require("discord.js"); module.exports = { data: new SlashCommandBuilder() .setName("suggest") .setDescription("将你的建议发送到指定频道") .addStringOption((option) => option .setName("suggestion") .setDescription("你要提交的建议内容") .setRequired(true) ), async execute(interaction) { let suggestion = interaction.options.getString("suggestion"); const embed = new MessageEmbed() .setColor("#0099ff") .setTitle(`${interaction.member.displayName} 提交了新建议`) .setDescription(`${suggestion}`); // 给交互返回响应,ephemeral参数表示只有发起命令的用户能看到这条消息 await interaction.reply({ content: "你的建议已提交成功", ephemeral: true }); await interaction.channel .send({ embeds: [embed], }) .then(function (message) { // 修改参数名避免覆盖外层的interaction对象 message.react(`👍`).then(() => message.react(`👎`)); }); }, };
如果不需要用户看到任何提示,可以把上面的interaction.reply部分替换为以下代码:
// 延迟响应,标记为仅发起者可见 await interaction.deferReply({ ephemeral: true }); // 直接删除回复,用户不会看到任何提示 await interaction.deleteReply();
内容的提问来源于stack exchange,提问作者Koto
相关产品推荐
相关产品推荐

