首页 > 解决方案 > bcrypt.compare() 是异步的,这是否一定意味着肯定会发生延迟?

问题描述

我正在使用bcryptjs包来散列和比较密码。

下面compareSync使用的方法是同步的并返回一个布尔值。它可靠并且按预期工作。

let trueOrFalse = bcrypt.compareSync('abcd', '1234');

if(trueOrFalse) {
    console.log('hooray, it was true');
} else {
    console.log('oops, it was false');
}

下一个示例使用异步compare方法。我担心因为这个版本是异步的,如果服务器上有任何延迟,它可能会if/elsebcrypt.compare确定res. 这是一个有效的问题还是我误解了这种异步函数的性质?

let trueOrFalse;
bcrypt.compare('abcd', '1234', function(err, res) {
    trueOrFalse = res;
}

if(trueOrFalse) {
    console.log('hooray, it was true');
} else {
    console.log('oops, it was false');
}

标签: javascriptnode.jsasynchronousbcrypt

解决方案


异步方法会和你的主程序并行执行,所以你console.log会在里面的回调函数之前完成bcrypt.compare。您将始终看到“哎呀,这是错误的”。

您可以在 main 函数中等待真正的结果,然后在控制台中显示一些内容。

要使比较“等待”,您可以将其包装成Promise

function compareAsync(param1, param2) {
    return new Promise(function(resolve, reject) {
        bcrypt.compare(param1, param2, function(err, res) {
            if (err) {
                 reject(err);
            } else {
                 resolve(res);
            }
        });
    });
}

const res = await compareAsync(param1, param2);
console.log(res);

我更喜欢将遗留回调函数包装到 Promises 中,因为它会将应用程序从回调地狱中拯救出来。


推荐阅读