如何解决处理嵌套的异步函数以返回一个最终结果
在我在 express 上运行的后端服务器中,我有:
app.post("/login",async(req,res) => {
try {
const { username,password } = req.body;
let result = await checkCredentials(username,password)
console.log("result of checkCredentials:",result);
res.json(result);
} catch (error) {
console.error(error);
}
});
在发布时,函数 checkCredentials
get 被调用
const checkCredentials = async (clientUsername,clientPassword) => {
try {
const dbUsernameObj = await pool.query("SELECT varol_users_dealer_username FROM varol_users_dealers_credentials WHERE varol_users_dealer_username = $1",[clientUsername]);
const dbUsername = dbUsernameObj.rows[0]?.varol_users_dealer_username
const dbHashObj = await pool.query("SELECT varol_users_dealer_hash FROM varol_users_dealers_credentials WHERE varol_users_dealer_username = $1",[clientUsername])
const dbHash = dbHashObj.rows[0]?.varol_users_dealer_hash
// the 4 lines above are sql queries that get the respective values,if they exist,if not they're undefined.
if (dbUsername === clientUsername) {
bcrypt.compare(clientPassword,dbHash,function(err,result) {
if (err) {
console.log(err)
}
return result
});
} else {
return false
}
} catch (error) {
console.error(error);
}
}
这段代码的问题是,如果我提供了正确的用户名和密码组合,当 checkCredentials
登录时,它返回 undefined。如果我的密码错误,它也会返回 undefined。
我认为问题在于承诺链,因为 bcrypt.hash
返回另一个承诺,并且 checkCredentials
get 的值在 bcrypt
完成之前被记录。
我该如何解决这个问题?非常感谢。
解决方法
尝试返回承诺
const promise = new Promise((resolve,reject)=>{
if (dbUsername === clientUsername) {
bcrypt.compare(clientPassword,dbHash,function(err,result) {
if (err) {
console.log(err)
}
resolve(result)
});
} else {
resolve(false)
}
})
return promise
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。