使用WokCommands开发Discord bot出现Invalid interaction应用指令错误
问题根源
该报错的核心原因是你使用的依赖版本组合存在指令注册缓存不匹配问题:
- WokCommands 1.3.6版本默认无指令持久化缓存,每次启动bot都会重新向Discord提交全局斜杠指令注册请求,新指令生成的ID会覆盖旧ID,但Discord端的全局指令缓存存在10-15分钟的刷新周期,缓存未刷新时调用旧ID的指令就会触发报错,等缓存同步完成后自动恢复正常。
- Discord.js v12对斜杠指令的支持为实验性实现,本身存在交互响应超时判定阈值偏低的问题,若指令回调3秒内未返回有效响应,Discord也会抛出「Invalid interaction application command」错误。
- 你当前的play指令代码中未对异步的
voice.play方法加await调用,若该方法为异步逻辑会导致返回空值/未完成渲染的embed,触发交互响应超时。
修复方案
- 调整WokCommands初始化配置,开启指令持久化缓存,避免每次启动重复注册指令:初始化时添加
cachePersist: true参数,仅在指令配置(描述、参数、名称)修改时才会向Discord提交更新请求,不会频繁替换指令ID。 - 测试阶段将指令的
testOnly属性设为true,同时在WokCommands初始化时指定测试服务器ID,服务器级指令的缓存刷新仅需1-2分钟,可完全避免全局指令的长延迟问题。 - 修正play指令的异步调用逻辑,给
voice.play添加await,同时可在回调开头先调用interaction.deferReply()拉长响应时间阈值到15分钟,避免超时,参考修改后的代码:
callback: async ({ interaction, client, args }) => { // 先挂起交互,避免3秒超时 await interaction.deferReply() let embed = new MessageEmbed(); embed.setAuthor('Velody', 'https://raw.githubusercontent.com/linusromland/Velody/master/Velody-logos.jpeg', 'https://github.com/linusromland/Velody') // 等待voice.play执行完成 embed = await voice.play(embed, client, interaction, args[0]); // 用editReply返回结果 await interaction.editReply({embeds: [embed]}) return; },
- 临时应急可重新邀请bot进服务器,邀请时确保勾选
applications.commands权限,强制清空服务器端的旧指令缓存。
内容的提问来源于stack exchange,提问作者Linus Romland
相关产品推荐
相关产品推荐

