Javascript 如何一直等待嵌套函数向父函数返回值
下面是一段代码。我总是在数据库查询完全执行之前运行Javascript 如何一直等待嵌套函数向父函数返回值,javascript,node.js,function,async-await,callback,Javascript,Node.js,Function,Async Await,Callback,下面是一段代码。我总是在数据库查询完全执行之前运行valid变量的最后一个返回语句时获得valid的初始值 async login(username, password, ctx) { let sql = 'SELECT * FROM users WHERE username=?;' let valid = false; //I'm always getting this value await this.db.query(sql, [user
valid
变量的最后一个返回语句时获得valid
的初始值
async login(username, password, ctx) {
let sql = 'SELECT * FROM users WHERE username=?;'
let valid = false; //I'm always getting this value
await this.db.query(sql, [username], function(err, rows, fields){
console.log(rows);
if(rows.length > 0)
{
console.log('coming into');
console.log(JSON.stringify(rows));
valid = bcrypt.compare(password, rows[0].pass)
console.log('valid is ', valid);
if(valid === false) throw new Error(`invalid password for account "${username}"`)
ctx.session.user_id = rows[0].id
ctx.session.authorised = true
return ctx.redirect(`/secure?msg=you are now logged in...`)
}
else
throw new Error(`username ${username} not found ${JSON.stringify(rows)}`);
return valid;
});
}
解决此问题的一种方法是将
db
-调用包装成一个承诺,然后等待该承诺得到解决/拒绝。然后,您可以设置授权标志并重定向用户或处理错误:
async login(username, password, ctx) {
try {
const rows = await new Promise((resolve, reject) => {
let sql = 'SELECT * FROM users WHERE username=?;'
this.db.query(sql, [username], function (err, rows, fields) {
if (rows && rows.length > 0) {
console.log('coming into');
console.log(JSON.stringify(rows));
valid = bcrypt.compare(password, rows[0].pass)
console.log('valid is ', valid);
if (valid === false) {
reject(new Error(`invalid password for account "${username}"`));
}
return resolve(rows);
}
reject(new Error(`username ${username} not found ${JSON.stringify(rows)}`); )
});
});
ctx.session.user_id = rows[0].id
ctx.session.authorised = true
return ctx.redirect(`/secure?msg=you are now logged in...`)
} catch (err) {
// handle your error, e.g. ctx.redirect('/error-page')
}
}
你能编辑你的问题并添加实际代码而不是图片吗?@eol i hv添加了代码