首页 > 解决方案 > 处理嵌套的异步函数以返回一个最终结果

问题描述

在我在 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);
    }
});

在帖子中,调用了函数checkCredentialsget

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

我该如何解决这个问题?非常感谢。

标签: javascriptnode.jspostgresqlexpressbcrypt

解决方案


尝试返回一个承诺

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


推荐阅读