我不想问这么简单的问题,但我在任何地方都找不到答案。
我正试图将sql结果推送到results2
,如果我在连接查询内部打印出results2
值,它会显示数组,但当我试图返回或在外部打印时,它显示为未定义。
代码:
function getUserData(cookie){
const sqlquery = "SELECT * FROM `users` WHERE `cookie` = ?"
const params = [cookie];
let results2 = [];
connection.query(sqlquery, params, function(error, results, fields){
if(error) throw error;
if(results && results.length){
results2.push(results[0]);
}else{
return("invalid");
}
})
console.log(results2)
return(results2);
}
我已经搜索并阅读了所有的文件,但我找不到我搞砸的地方。
欢迎来到回调和异步操作的世界。
如果我打印出results2值在连接查询中,它显示数组,但是当我试图返回或在外部打印它时,它显示为未定义。
这里console.log(results2)
首先运行,在回调中,您将为results2赋值。所以,你看不到它。
您可以将wait与查询一起使用:
//const util = require('util');
function getUserData(cookie){
const sqlquery = "SELECT * FROM `users` WHERE `cookie` = ?"
const params = [cookie];
let results2 = [];
try {
// if not able to use await promisfy it using
// const query = util.promisify(conn.query).bind(connection);
// const result = await query(sqlquery, params);
const result = await connection.query(sqlquery, params);
results2.push(result);
} catch(e) {
console.log(e);
}
您的问题是JavaScript是同步的(尝试一次做尽可能多的事情(,除非您告诉它不要这样做。它在实际填充之前返回reults2
,因为这样做更快。因此,您需要通过在function
之前添加async
,在connection.query
之前添加await
,并在调用getUserData之前添加and,使函数作为一个整体异步(如在await getUserData(var1, var2)
中(。
异步函数和等待的解释如下:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
由于异步函数需要嵌套才能工作(await
s需要在异步函数本身中的任何内容(,您可能会开始收到关于函数不是异步开始的错误。