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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:22:44