Discord.js v12.5.3重构音乐机器人 非play斜杠命令触发404错误
错误触发原因
- 第一个核心问题:你自定义的
interaction.reply方法存在this指向错误。你用普通函数定义reply方法时,函数内部的this并不指向当前交互实例interaction,而是绑定到了外层作用域的上下文,导致调用client.api.interactions(this.id, this.token)时传入了错误的交互ID和令牌,请求的接口路径自然无效,触发404报错。 - 第二个常见诱因:交互回调存在3秒超时限制。你在
skip命令里执行了await client.guilds.fetch这类异步操作,如果整体处理耗时超过3秒,Discord会直接使当前交互的令牌失效,此时再发送回调请求也会返回404。 - 额外排查点:每个交互仅允许发送一次初始回调,你如果在单次命令执行流程中多次调用
interaction.reply,也会导致后续请求触发404。你提到play命令无报错,大概率是play命令的执行流程没有走到调用自定义reply的环节,或者逻辑执行顺序避开了指向错误。
修复方案
第一步:修复自定义reply的指向问题
直接放弃用this取值,改用当前作用域下的interaction实例获取ID和令牌,代码修改如下:
// 原错误代码 interaction.reply = (client, response) => { client.api.interactions(this.id, this.token).callback.post({ data: { type: 4, data: { content: response, }, }, }); }; // 修改后代码 interaction.reply = (client, response) => { // 直接用当前interaction的id和token,不要用this client.api.interactions(interaction.id, interaction.token).callback.post({ data: { type: 4, data: { content: response, }, }, }); };
第二步:适配超时场景避免令牌失效
如果命令处理逻辑耗时较长,先发送延迟回复占位,处理完成后再编辑回复内容:
// 先发送延迟回复(type 5),告知Discord你需要更多时间处理 client.api.interactions(interaction.id, interaction.token).callback.post({ data: { type: 5, } }); // 后续处理完成后用patch方法编辑回复 client.api.webhooks(client.user.id, interaction.token).messages('@original').patch({ data: { content: "最终回复内容" } });
最优方案:直接使用discord.js v12内置的交互方法
你使用的v12.5.3已经原生支持斜杠交互的reply、deferReply等方法,不需要自己手动封装底层API调用,直接调用内置方法即可避免此类低级错误:
// 直接调用内置reply,不需要自定义封装 interaction.reply("回复内容"); // 延迟回复 interaction.deferReply().then(() => { // 处理逻辑完成后编辑回复 interaction.editReply("最终内容"); });
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

