bcrypt.compare() 是异步的,那是不是就一定会延迟呢?

bcrypt.compare() is asynchronous, does that necessarily mean that delays are certain to happen?

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

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

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

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

下一个示例使用异步 compare 方法。我担心因为这个版本是异步的,如果服务器上有任何延迟,它可能会在 bcrypt.compare 确定 res 的值之前到达 if/else 语句。这是一个合理的担忧,还是我误解了这种异步函数的性质?

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');
}

异步方法将与您的主程序并行执行,因此您的 console.log 将在 bcrypt.compare 中的回调函数之前完成。你总是会看到 'oops, it was false'.

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

为了比较 'waitable' 你可以把它包装成 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 中,因为它会从 callback hell.

中保存应用程序

Node.js 运行时间肯定会 运行 在您从异步计算中获得结果之前的同步代码(if-else 语句)。保证计算仅在回调函数完成:

bcrypt.compare('abcd', '1234', function(err, res) {
    // make your checks here
    if (res) {
      // ...
    }
})