防止Discord Bot崩溃(mysql)

时间:2019-10-22 17:05:20

标签: mysql discord.js

我有一个不和谐的机器人,我正在处理一个命令,该命令显示mysql数据库中有关字符的信息(通过提供字符名称)。它可以正常工作,但是如果我提供的数据库中不存在的名称(如!characterinfo asdasfefcdce),则机器人会崩溃。所以我的问题是How do I prevent it from crashing if I provide a wrong name?。希望你明白我的意思。

代码如下:

const Discord = require('discord.js');
const mysql = require('mysql');
const {stripIndents} = require("common-tags");
const { prefix, token } = require('../config.json');

module.exports.run = async (bot, message, args, connection3) => {

    if (message.content == '!characterinfo') {
        return message.reply('provide a character name!');
    }

    const name = args[0];

    connection3.query('SELECT * FROM characters WHERE name = ?', [name], function(err, results, rows) {
        if (err) throw err;

    const embed = new Discord.RichEmbed()
    .setColor('RANDOM')
    .setTitle('**Character Information**')
    .addField('Nickname:', results[0].name)
    .addField('Level:', results[0].level)
    .setFooter(`test`)

    .setTimestamp();

     message.channel.send(embed);
  });

}

module.exports.help = {
    name: "characterinfo",
}

如果您需要我提供更多信息,请告诉我。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

由于此行,该机器人此刻崩溃了

if (err) throw err;

您抛出错误并且以后不处理,更改此错误的最简单方法是用console.log或console.error替换throw

if (err) console.error(err);

或者您可以扔掉并用try / catch封装代码。

try {
    connection3.query('SELECT * FROM characters WHERE name = ?', [name], function (err, results, rows) {
        if (err) throw err;

        const embed = new Discord.RichEmbed()
            .setColor('RANDOM')
            .setTitle('**Character Information**')
            .addField('Nickname:', results[0].name)
            .addField('Level:', results[0].level)
            .setFooter(`test`)
            .setTimestamp();

        message.channel.send(embed);
    });
} catch(err) {
    // Handle the error ...
    console.log(err)
}

编辑:因此,错误实际上是由于查询找不到结果时,结果数组没有任何条目而引起的,因此此解决方案应该有效。

在执行其他任何操作之前,您应该检查是否有“结果”。

try {
    connection3.query('SELECT * FROM characters WHERE name = ?', [name], function (err, results, rows) {
        if (err) throw err;
        if (!results[0]) return;

        const embed = new Discord.RichEmbed()
            .setColor('RANDOM')
            .setTitle('**Character Information**')
            .addField('Nickname:', results[0].name)
            .addField('Level:', results[0].level)
            .setFooter(`test`)
            .setTimestamp();

        message.channel.send(embed);
    });
} catch(err) {
    // Handle the error ...
    console.log(err)
}