You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:51:03