首页 > 解决方案 > 使用 discord.js 命令处理程序捕获 NodeJS 错误

问题描述

我正在创建一个Discord 机器人,但在捕捉我的机器人发送的错误时遇到了一些问题。我正在使用自定义命令处理程序,效果很好。

Fs.readFile(`./database/prefixes/prefixes.json`, "utf8", (err: Error, data): void => {
    data = JSON.parse(data);
    const prefix: string = data[message.author.id] == undefined ? "ma!" : data[message.author.id];

    const msg: string = message.content;
    const args: string[] = message.content.slice(prefix.length).trim().split(" ");
    const cmd: string = args.shift().toLowerCase();

    if (!msg.startsWith(prefix)) {
        return checkCustomCommands();
    }

    let ops: {} = {
        queue: queue
    }

    try {
        require(checkFolders(cmd)).run(Client, message, args, ops); // maybe catching just there?
        Logger.log(`${message.author.tag} just used the ${cmd} power in ${message.guild.name}.`);
    } catch (err) {
        Logger.log(`The command ${message.author.tag} tried to call in ${message.guild.name} doesen't seem to exist.`);
    }

});

function checkCustomCommands() {
    let content = JSON.parse(Fs.readFileSync('./database/commands/commands.json', 'utf8'));

    try {
        if (content[message.guild.id][message.content] == undefined) {
            return;
        } else {
            message.channel.send(content[message.guild.id][message.content]);
        }
    } catch (err) {
        return;
    }
}

function checkFolders(command) {
    let folders = ["moderation", "fun", "music", "info", "game"];
    var files: string[];
    var finalPath: string;

    folders.forEach(folder => {
        files = Fs.readdirSync(`./src/commands/${folder}`);

        files.forEach(file => {
            if (file.split(".")[0] == command) {
                return finalPath = `./../commands/${folder}/${file.split(".")[0]}.js`;
            }
        });
    });

    return finalPath;
}

但有时,我的机器人会将我无法捕获的各种错误发送到命令文件中,导致我的机器人被关闭。有什么方法可以防止在命令处理程序中发生这种情况,或者我可以采取什么措施来捕获这些错误

非常感谢,如果需要,我可以提供更多代码,即使命令处理程序的最大块就在那里 ^

标签: node.jsdiscord.js

解决方案


我已经很晚了,但我觉得我应该回答我自己的问题,现在我可以这样做了哈哈

捕获这些错误的主要方法是unhandledRejection通过 Node 监听事件process

我是这样做的:

async function handleRejections() {
    process.on("unhandledRejection", (error: Error) => {
        const errorEmbed: Discord.MessageEmbed = new Discord.MessageEmbed()
            .setDescription("<:no:835565213322575963> An error has been detected... \n" + `\`\`\`${error.stack}\`\`\``)
            .setTimestamp()
            .setFooter(client.user.username, client.user.displayAvatarURL())
            .setColor("DARK_RED")

        logError(client, errorEmbed);
    });
}

确保在项目代码的最开始调用该函数,甚至在机器人启动之前。

我个人将这些错误记录到我服务器上的 Discord 频道中,以便我可以轻松检查它们。而已!希望有帮助。继续编码:D


推荐阅读