【问题标题】:Preventing discord bot from crashing (mysql)防止不和谐机器人崩溃(mysql)
【发布时间】:2020-02-18 21:27:36
【问题描述】:

我有一个不和谐的机器人,我正在处理一个命令,该命令显示来自 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",
}

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

感谢任何帮助!

【问题讨论】:

    标签: mysql discord.js


    【解决方案1】:

    此时机器人崩溃了,因为在这一行

    if (err) throw err;
    

    你抛出一个错误,以后不处理,最简单的改变方法是用 console.log 或 console.error 替换 throw

    if (err) console.error(err);
    

    或者您可以保留 throw 并使用 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)
    }
    

    【讨论】:

    • 我尝试了这两种方法,但如果我输入一个不在数据库中的名称TypeError: Cannot read property 'name' of undefined,它仍然会给出相同的错误
    • 在创建嵌入之前检查是否有结果,我会用代码更新答案。
    • 我的意思是......当我使用数据库中的名称时,它工作得非常好,但是当我使用数据库中没有的名称时,我得到了那个错误。
    • 我在答案中添加了新的解决方案,试试看。
    • 还是一样:c
    猜你喜欢
    • 2020-12-18
    • 2021-05-30
    • 2018-03-20
    • 2021-08-11
    • 2021-11-24
    • 1970-01-01
    • 2020-05-24
    • 2021-05-01
    • 2020-07-03
    相关资源
    最近更新 更多