说明:
正如BadSpencer 所述,mysql 驱动程序是异步的,并且基于回调。
假设您打算接您的朋友去参加体育赛事。你不确定他们希望你什么时候来,所以你给他们打电话问他们。他们想了一会儿,然后告诉你一个时间。你得到了你要求的信息,所以你挂断了。在编程术语中,这将是同步代码的示例(有时被认为是 Node.js 中的“正常”代码)。
让自己回到同样的境地。然而,当你这次打电话给你的朋友时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断了,但现在你等着。一个小时后,他们给你回电话,告诉你时间。这就是异步代码的思考过程。
屏幕后面还有很多内容,但为简单起见,我不会在这个答案中用所有这些信息轰炸你。
解决方案:
您应该传递一个函数作为回调函数,该回调函数将使用返回的数据。考虑这个例子:
let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`;
// Passing the callback function as the second parameter.
connection.query(query, (err, result) => {
if (err) return console.error(err);
if (result.length > 0) console.log('It works (it actually does).');
});
但是,由于结果的范围和代码的后续流程,这种基于回调的性质可能会成为一场噩梦。几次查询后,您的代码可能会变得混乱。为防止这种情况,您可以将查询包装在您自己的 Promise(或使用基于 Promise 的 mysql 包,如 promise-mysql)和 await 调用中。
这是一个示例设置:
// Defining 'connection' as a parameter so
// you can export this function and use it
// anywhere.
function query(connection, sql) {
return new Promise((resolve, reject) => {
connection.query(sql, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}
// Asynchronous context needed for 'await' (this needs to be within an async function).
let query = `SELECT userId FROM QR5PVGPh1D.users WHERE userId = '${member.id}'`;
let result = await query(connection, query)
.catch(console.error);