各位大神们,我是Nodejs小白,最近在写一个koa的login,用的是MySQL数据库。今天遇到了一个完全不明白的问题,如上图,这是loginRouter, 我在if逻辑判断之前新建了一个变量var resultOuter, 其实这个resultOuter只是想把await userdbconnection.query(“SELECT password FROM user WHERE username=?”, [username], function(err, result)这里面返回的result带出function之外的,因为在await userdbconnection.query(“SELECT password FROM user WHERE username=?”, [username], function(err, result){…}之中,我给ctx.body亦或是ctx.message赋值完全没有任何作用,所以我想把这个result带出来,在外面做判定,然后再赋值给ctx.body和ctx.message,可是不管尝试了什么方法,这个result只要一离开function之外就变成了undefined,我测试了一下,因为异步的原因,在这一整个loginRouter执行的过程中,在遇到await userdbconnection.query(“SELECT password FROM user WHERE username=?”, [username], function(err, result)这一行的时候,并不会等它执行完毕,会先执行最下面的console.log(resultOuter)而此时,resultOuter=getPassword并没有执行,所以外面的resultOuter是undefined,但是虽然我知道是这样,我查了好多办法让userdbconnection.query先执行,然后再console.log就是不行,各位大神有没有什么办法,可以让我把function里面的result传到外面去呢?(话有点多,只是想给各位大神解释清楚。。。。)
写的很好
@stjw7098 求问如何把这个result拿出来。。。。
很显然,你的userdbconnection.query方法是一个标准的异步回调式的函数调用,所以会直接执行下面的console.log(resultOuter)。你可以包装一下userdbconnection.query,让其返回一个Promise,这样你的await就有作用了。
@nullcc 我尝试一下,谢谢!
@nullcc 我尝试了,但是就算返回promise,这个resultOuter还是取不出来啊。。。
这里面没必要用await吧。就一个标准的异步回调。感觉这代码有点为了async/await而强行async/await。
const query = function () {
reutrn new Promise(((resolve, reject) => {
userdbconnection.query('xxxxx' , username, (err,result )=>{
if(err) {
return reject(err);
}
resolve(result);
})
}))
}
然后后面调用;
let result;
try {
result = await query();
} catch (err) {
console.log(err);
return;
}
......// 取到数据后的操作
要用的话,await后面起码要是个promise
@foora 谢谢!!!