Discord.js v13如何删除重复的斜杠命令?
解决Discord斜杠命令重复的方案
第一步:排查本地文件重复
首先检查/slash-cmds目录下的所有命令文件,确认没有两个不同文件的name字段完全相同的情况。你现有代码会把所有带name字段的命令都推入arrayOfSlashCommands数组,如果两个文件的name一致,推送到服务器后就会出现重复命令,找到重复文件后删除多余的即可。
第二步:清理残留的旧命令
如果本地文件没有重复,就是之前注册的旧命令没有被正常覆盖,可选择以下任意一种方法清理:
方法1:批量清空后重新注册
在你现有代码的ready事件中加入清空命令的逻辑,启动一次bot完成清理后再注释掉该逻辑即可:
portle.on("ready", async () => { const targetGuild = portle.guilds.cache.get("884380331170484244"); // 清空当前服务器所有斜杠命令,清理完成后可以注释/删除这行 await targetGuild.commands.set([]); // 重新注册现有命令 await targetGuild.commands.set(arrayOfSlashCommands); });
清理完成后记得删掉清空逻辑,否则每次启动都会重新加载所有命令,会有几秒钟的命令不可用延迟。
方法2:单独删除指定重复命令
如果不想清空所有命令,可以单独删除重复的项:
- 先在
ready事件中加入代码打印所有已注册命令的ID和名称:
portle.on("ready", async () => { const targetGuild = portle.guilds.cache.get("884380331170484244"); const allCommands = await targetGuild.commands.fetch(); allCommands.forEach(cmd => console.log(`命令名:${cmd.name} | 命令ID:${cmd.id}`)); });
- 启动bot后从控制台找到重复命令的ID,执行删除逻辑:
// 将下方的<重复命令ID>替换为你控制台查到的对应ID await targetGuild.commands.delete('<重复命令ID>');
额外注意事项
如果你之前还注册过全局斜杠命令,全局命令最长需要1小时完成同步,看到的重复也可能是全局命令和服务器命令叠加导致的,可执行以下代码清空全局命令:
await portle.application.commands.set([]);
全局命令清空后需要等待同步完成才能看到效果。
内容的提问来源于stack exchange,提问作者Lumins
相关产品推荐
相关产品推荐

