【问题标题】:discord.js/node.js make code wait until sql query returns resultdiscord.js/node.js 让代码等到 sql 查询返回结果
【发布时间】:2019-10-23 21:44:15
【问题描述】:

我正在开发一个 discord.js 机器人,并且我正在将大量信息存储在数据库中的各种服务器上。问题是,代码不会等待数据库返回结果。在当前情况下,我正在尝试检查服务器特定前缀是否签出。

我尝试在不同的地方使用asyncawait,但这些都不起作用。如果可以,我宁愿不使用.then(),因为我真的不想将所有命令都放在.then() 中。

const { Client, Attachment, RichEmbed } = require('discord.js');
const client = new Client();
const mysql = require("mysql");
const config = require("./config.json")

var con = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'botdb'
})

client.on("ready", () => {
    console.log("I'm ready")
})

client.on("message", message => {
    if (message.author.bot) return;
    if (message.channel.type === 'dm') return;

    let msg = message.content.split(" ");
    let command = msg[0];
    let prefix;

    con.query(`SELECT * FROM serversettings WHERE ServerID = ${message.guild.id}`, (err, rows) => {
        if (err) throw err;
        prefix = rows[0].Prefix;
        console.log(prefix)
    })

    console.log(`Prefix: ${prefix}, Command: ${command}`)
    if (command === `${prefix}examplecommand`) {
        //Do something
    }
    //Other code that uses prefix and command
}

它应该首先记录前缀,然后是 Prefix: ${prefix}, Command: ${command} 部分,但它是反过来的,所以 example 命令不起作用。

【问题讨论】:

    标签: mysql node.js discord.js


    【解决方案1】:

    您的结果是由于查询回调之外的内容在调用后立即执行。请记住,mysql 模块是基于回调的。

    可能的解决方案

    • 将代码放在回调中,以便在查询完成时执行。
    • 将查询包装在一个 Promise 中并等待它。

      function getGuild(guildID) {
        return new Promise((resolve, reject) => {
          con.query(`SELECT * FROM serversettings WHERE ServerID = '${guildID}', (err, rows) => {
            if (err) return reject(err);
      
            resolve(rows);
          });
        });
      }
      
      const [guild] = await getGuild(message.guild.id)  // destructuring 'rows' array
        .catch(console.error);
      
      console.log(guild.prefix);
      
    • 使用基于 Promise 的 MySQL 包装器版本,例如 promise-mysql。您可以像上面的代码一样使用它,而不必担心编写自己的 Promises。

      const [guild] = await con.query(`SELECT * FROM serversettings WHERE serverID = '${message.guild.id}'`)
        .catch(console.error);
      
      console.log(guild.prefix);
      

    【讨论】:

    • 谢谢,第一个选项做了一些小的修改,效果很好。就一个问题。 [guild] 在方括号中是有原因的吗?
    • 括号是解构语法的一部分。基本上,在这种情况下,它将guild 声明为查询返回的数组的第一个元素。有关解构的更多信息,请参阅here。 (它在其他情况下更有用。)
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 2012-07-26
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多