我正在研究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不起作用。
答案 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);