微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理嵌套的异步函数以返回一个最终结果

如何解决处理嵌套的异步函数以返回一个最终结果

在我在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。