Discord.js开发Slash Command返回Embed触发Unknown Webhook错误如何解决
问题原因
- Discord斜杠命令的交互token默认有效期仅为3秒,你在代码中发起了对谷歌的网络请求,使用回调式写法,只要请求耗时超过3秒,交互对应的临时webhook就会被Discord回收,此时调用
interaction.reply就会抛出Unknown Webhook错误,你拿到的错误码10015就是该问题的官方标识。 - 你使用的
superagent回调写法不符合当前异步逻辑管控要求,async execute函数没有等待请求完成就直接结束,discord.js会判定该交互未被处理,也会提前释放交互资源。 - 额外注意:如果你的机器人部署在中国大陆地区,访问谷歌本身就会超时,必然会触发该错误。
修复方案
- 在发起网络请求前调用
interaction.deferReply(),提前告知Discord你需要延迟回复,将交互有效期延长到15分钟 - 将
superagent的回调写法改成async/await的Promise调用方式,统一管控异步流程 - 网络请求完成后用
interaction.editReply()替换原有的interaction.reply(),更新之前的延迟回复内容
修复后完整代码:
const { SlashCommandBuilder } = require(`@discordjs/builders`); const { MessageEmbed, CommandInteraction } = require(`discord.js`); const moment = require("moment"); const request = require("superagent"); module.exports = { data: new SlashCommandBuilder() .setName(`ping`) .setDescription(`Calcul du temps d'envoit d'un message.`), /** * * @param {CommandInteraction} interaction */ async execute(interaction) { // 触发延迟回复,延长交互有效期 await interaction.deferReply(); const FirstQuery = new Date(); try { // 改用await方式发起请求,统一异步流程 await request.get(`http://www.google.com`); const LastQuery = new Date(); const Time = LastQuery.getTime() - FirstQuery.getTime(); const Response = Time/(5*2); const embed = new MessageEmbed() .setColor(0x234259) .setDescription(`🏓 **Le temps de réponse est de ${Response}ms.**`) // 编辑延迟回复的内容 await interaction.editReply({ embeds: [embed] }); } catch (err) { // 捕获请求异常,给出友好提示 await interaction.editReply(`网络请求失败,请稍后重试`); } } }
内容的提问来源于stack exchange,提问作者Itoshuga
相关产品推荐
相关产品推荐

