discord.js / node.js使代码等到sql查询返回结果

时间:2019-06-08 21:40:26

标签: mysql node.js discord.js

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

我尝试在不同的地方使用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}

它应该首先记录前缀,然后记录Sub ChapterHeadings() ' ' ChapterHeadings Macro ' Dim Chapter As Variant Chapter = Array("Chapter One", "Chapter Two", "Chapter Three", "Chapter Four", "Chapter Five") Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Style = ActiveDocument.Styles( _ "Heading 1,Chapter Heading") With Selection.Find .Text = Chapter .Replacement.Text = "^m"Chapter"^p^p" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub 部分,但是它以相反的方式进行记录,因此examplecommand不起作用。

1 个答案:

答案 0 :(得分:0)

您的结果是由以下事实引起的:查询回调之外的内容在调用后立即执行。请记住mysql模块是基于回调的。

可能的解决方案

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

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