如何在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
相关产品推荐
相关产品推荐

