首页 > 解决方案 > discord.js/node.js 让代码等到 sql 查询返回结果

问题描述

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

我尝试在各个地方使用asyncand await,但这些都不起作用。如果可以的话,我宁愿不使用.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}部分,但它以相反的方式执行,因此示例命令不起作用。

标签: mysqlnode.jsdiscord.js

解决方案


您的结果是由于查询回调之外的内容在调用后立即执行的事实引起的。请记住,该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);
    

推荐阅读