调用handleCommands后仍有幽灵命令,Discord.js Bot问题咨询
Discord.js重载命令后残留幽灵命令的问题解决
问题描述
调用handleCommands函数重载机器人命令后,Discord命令面板中仍存在已删除的"幽灵命令",需排查操作失误并找到命令重置方法。
核心错误点分析
1. 未清空旧命令数据
每次执行handleCommands时,没有重置client.commands集合和client.commandsArray数组,导致旧命令数据持续残留。提交给Discord的命令数组包含新旧命令混合数据,Discord会保留所有提交的命令,因此已删除的命令不会被移除。
2. 异步循环处理不当
使用forEach(async file => {})遍历命令文件,但forEach不支持异步等待,导致循环内的命令加载逻辑还未全部完成,就提前执行了Discord API的提交请求,可能导致命令数组不完整或数据异常。
3. 全局/服务器命令混淆(可选)
如果之前通过client.application.commands.set()部署过全局命令,但当前仅更新服务器级命令,全局命令不会被自动删除,会以幽灵命令的形式留在面板中。
修复代码
修改后的handleCommands函数
const { Collection } = require('discord.js') const { loadFiles } = require('../functions/fileLoader'); const { REST } = require('@discordjs/rest'); const { Routes } = require('discord-api-types/v9') module.exports = (client) => { client.handleCommands = async() => { // 关键:每次重载前清空旧命令数据 client.commands.clear(); client.commandsArray = []; const commandFiles = await loadFiles('commands'); const commandsTable = [] // 用for...of替代forEach,支持异步等待 for (const file of commandFiles) { try { const command = await require(file); client.commands.set(command.data.name, command); client.commandsArray.push(command.data.toJSON()); commandsTable.push({ 'Command': command.data.name, 'Status': '✅'}); } catch (e) { commandsTable.push({ 'Command': file.split('/').pop().slice(0,-3), 'Status': '❗️'}); console.error(e); } } const rest = new REST({version:9}).setToken(process.env.BOT_TOKEN); try{ // 全量覆盖服务器命令 await rest.put(Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID), { body: client.commandsArray }); // 如果之前部署过全局命令,取消注释下面一行同步全局命令 // await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), { body: client.commandsArray }); } catch(e) { console.error(new Error('Failed to load guildCommands', {cause:e})); } console.table(commandsTable); }; };
额外重置操作(如果仍有幽灵命令)
如果修复后仍存在残留命令,可执行以下操作:
- 清空服务器命令:临时将
body设为空数组提交,强制删除所有服务器命令,再重新加载:await rest.put(Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID), { body: [] }); - 清空全局命令(如果有):
await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), { body: [] }); - 等待Discord命令同步:Discord命令面板的同步可能有延迟,等待1-2分钟后刷新查看。
内容的提问来源于stack exchange,提问作者Felipe9
相关产品推荐
相关产品推荐

