discord.js v12.5.3 删除斜杠命令触发DiscordAPIError:404错误如何解决?
错误原因
你触发404的核心原因是请求路径非法:从报错返回的path字段可以看到,路径里重复拼接了多段/commands/[命令ID],这是因为你提前定义的guildCommands是可变的discord.js API构建对象,每次循环调用.commands(slashCommand.id)都会直接修改这个对象的已拼接路径:
- 第一次循环删除时路径为
/applications/[应用ID]/guilds/[服务器ID]/commands/[命令1ID],路径正常 - 第二次循环删除时会在上述路径后继续追加
/commands/[命令2ID],路径已经非法 - 循环次数越多追加的路径段越多,最终触发404不存在错误
额外还有一个隐藏问题:你用forEach包裹异步删除逻辑,async/await不会按预期等待所有删除请求执行完成,可能出现部分命令漏删的情况。
修复方案
推荐两种实现方式,按需选择即可:
方式1:循环单删(适合删除指定部分命令)
每次请求都重新构建完整路径,同时把forEach替换为for...of保证异步逻辑顺序执行:
async function getCommands(guild) { return client.api .applications(client.user.id) .guilds(guild.id) .commands.get(); } let slashCommands = await getCommands(guild).catch(console.error); for (const slashCommand of slashCommands) { await client.api .applications(client.user.id) .guilds(guild.id) .commands(slashCommand.id) .delete(); }
方式2:批量覆盖清空(适合清空所有服务器命令,效率更高)
如果你的需求是清空当前服务器所有已部署的斜杠命令,不需要循环删除,直接调用批量覆盖接口传空数组即可:
await client.api .applications(client.user.id) .guilds(guild.id) .commands.put({ data: [] });
内容的提问来源于stack exchange,提问作者shestakov-dev
相关产品推荐
相关产品推荐

