Discord.js v13如何让Guild Command与Global Command同时生效
Discord.js 同时注册全局/公会斜杠命令实现方案
两类命令的注册接口完全独立,无法同时生效基本是注册时把两类命令混在同一个接口提交、触发全量覆盖逻辑导致的,按以下步骤操作即可。
前置注意事项
- 全局命令(Global Command)注册后存在最长1小时的平台缓存延迟,不是即时生效;公会命令(Guild Command)注册后即时生效
- 全局命令、公会命令是分开存储的两套数据,注册时不要把两类命令混传到同一个注册接口
- 如果之前错误把公会专属命令注册成了全局命令,要先删除对应错误的全局命令记录,否则所有服务器都会看到该命令
具体实现代码
1. 拆分命令配置
把两类命令的定义分开存储,不要混在同一个数组里:
const { SlashCommandBuilder, REST, Routes } = require('discord.js'); const TOKEN = '你的机器人Token'; const CLIENT_ID = '你的机器人客户端ID'; // 替换为你自己的私有服务器ID const PRIVATE_GUILD_ID = '你的私有服务器ID'; // 全局生效命令集合,仅放入需要全服生效的cmd_1 const globalCommands = [ new SlashCommandBuilder() .setName('cmd_1') .setDescription('全局生效的测试命令1') .toJSON() ]; // 私有服专属命令集合,仅放入需要私有服生效的cmd_2 const privateGuildCommands = [ new SlashCommandBuilder() .setName('cmd_2') .setDescription('私有服专属的测试命令2') .toJSON() ];
2. 分开调用注册接口
分别调用全局、公会维度的注册接口,传入对应分类的命令数组,不要混传:
const rest = new REST({ version: '10' }).setToken(TOKEN); (async () => { // 注册全局命令 await rest.put( Routes.applicationCommands(CLIENT_ID), { body: globalCommands } ); console.log('全局命令注册请求已提交,等待平台缓存生效(最长1小时)'); // 注册私有服专属公会命令 await rest.put( Routes.applicationGuildCommands(CLIENT_ID, PRIVATE_GUILD_ID), { body: privateGuildCommands } ); console.log('私有服公会命令注册完成,即时生效'); })();
交互处理说明
不需要在interactionCreate事件里区分命令是全局还是公会来源,两类命令的交互结构完全一致,直接匹配命令名执行对应逻辑即可。
常见问题排查
- 如果发现私有服外的服务器也能看到cmd_2:说明之前错误把cmd_2注册成了全局命令,调用
rest.delete(Routes.applicationCommand(CLIENT_ID, 冗余全局cmd_2的ID))删除错误记录即可 - 如果注册后看不到命令:全局命令等待缓存更新即可,公会命令可以重启Discord客户端、重新进入服务器触发列表刷新
- 如果出现重复命令:进入对应服务器的「服务器设置-整合-你的机器人」页面,删除多余的重复命令条目即可
内容的提问来源于stack exchange,提问作者IamNeyk
相关产品推荐
相关产品推荐

