javascript - 处理嵌套的异步函数以返回一个最终结果
问题描述
在我在 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。
但是当我的用户名错误时,它会返回 false。
我相信问题在于承诺链接,因为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
推荐阅读
- swift - 如何在 Swift 中嵌入文件?
- c++ - 使用 `emplace_back` 而不是 `push_back` 时没有缩小警告
- excel - Excel 数据中的变音符号
- mysql - 将视图查询转换为 mysql 查询
- python - IPython (jupyter) 与 Python (PyCharm) 的性能对比
- python - np.where 计算年龄组指数
- wordpress - 如何在 LOCALHOST 中增加 WordPress 中的最大上传文件大小
- javascript - 如何动态更改类中的方法?
- java - 如何导入生成文件夹中的java类?
- webpack - webpack.config:包含参数