fowled
fowled

Reputation: 296

Catching NodeJS errors using a discord.js command handler

I'm creating a Discord bot, but have some problems catching the errors that my bot sends. I'm using a custom command handler, that is working pretty well.

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;
}

But sometimes, my bot sends various errors that I can't catch into the commands files, resulting in my bot being shutdown. Is there any way to prevent that inside the command handler, or anything I can do to catch these errors?

Thanks a lot, I can provide more code if needed, even though the biggest chunk of the command handler is just there ^

Upvotes: 1

Views: 202

Answers (1)

fowled
fowled

Reputation: 296

I'm quite late to this, but I feel like I should answer my own question, now that I'm able to do so haha

The main way to catch these errors is by listening to the unhandledRejection event, via Node process.

Here's how I did it:

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);
    });
}

Be sure to call the function at the very beginning of the project code, even before the bot starts.

I personally log these errors into a Discord channel, on my server, so that I can check them easily. That's it! Hope that helps. Keep on coding :D

Upvotes: 1

Related Questions