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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:24:28