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

如何在Discord.js中批量删除并刷新机器人的服务器指令?

解决Discord.js批量删除并刷新所有服务器指令的问题

问题分析

你当前的代码缺少有效的指令删除逻辑,且对client.guilds.cache的遍历和指令对象的访问存在错误:

  • client.guilds.cache是Collection类型,直接遍历得到的是[guildId, guild]格式的数组,可通过解构赋值更清晰地获取ID与Guild对象;
  • guild[1].commands.permissions.guild是无效访问路径,Discord.js中Guild的指令管理需通过guild.commands(GuildCommandsManager)操作。

正确实现方案

要批量删除所有服务器指令并重新添加,推荐用REST API覆盖的方式(高效且简洁),也可通过GuildCommandsManager批量删除,以下是完整修改代码:

require('dotenv').config();
const { Client, IntentsBitField, REST, Routes, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    IntentsBitField.Flags.Guilds,
    IntentsBitField.Flags.GuildMembers,
    IntentsBitField.Flags.GuildMessages,
    IntentsBitField.Flags.MessageContent,
    GatewayIntentBits.Guilds
  ]
});

const commands = [
  {
    name: 'get',
    description: 'gets message',
  },
];

(async () => {
  try {
    console.log('Starting command refresh process...');
    const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);
    
    await client.login(process.env.TOKEN);
    
    // 遍历所有机器人加入的服务器
    for (const [guildId, _] of client.guilds.cache) {
      console.log(`Processing guild: ${guildId}`);
      
      // 清空服务器所有指令
      console.log(`Clearing existing commands in ${guildId}`);
      await rest.put(
        Routes.applicationGuildCommands(process.env.CLIENT_ID, guildId),
        { body: [] }
      );
      
      // 重新注册新指令
      console.log(`Registering new commands in ${guildId}`);
      await rest.put(
        Routes.applicationGuildCommands(process.env.CLIENT_ID, guildId),
        { body: commands }
      );
    }

    console.log('All guild commands have been refreshed successfully!');
    await client.destroy();
  } catch (error) {
    console.error(`Error during command refresh:`, error);
    process.exit(1);
  }
})();

关键细节说明

  • 用rest.put()传入空数组{ body: [] }可一次性清空服务器指令,比逐条删除效率更高;
  • 遍历client.guilds.cache时用解构赋值const [guildId, _],仅保留需要的服务器ID;
  • 操作完成后调用client.destroy()退出客户端,避免进程挂起;
  • 确保机器人拥有applications.commands权限,且.env文件中TOKEN和CLIENT_ID配置正确。

内容的提问来源于stack exchange,提问作者Donutowiec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:47:13