bcrypt.compare() 是异步的,这是不是一定意味着肯定会发生延迟? [复制]

Posted

技术标签:

【中文标题】bcrypt.compare() 是异步的,这是不是一定意味着肯定会发生延迟? [复制]【英文标题】:bcrypt.compare() is asynchronous, does that necessarily mean that delays are certain to happen? [duplicate]bcrypt.compare() 是异步的,这是否一定意味着肯定会发生延迟? [复制] 【发布时间】:2020-02-02 02:40:30 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

异步方法将与您的主程序并行执行,因此您的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 中,因为它会从 callback hell 保存应用程序。

【讨论】:

"你应该在你的主线程中等待" - 这是不可能的。该问题的适当缓解方法是将console.log 推迟到未来(异步任务完成时),方法是将其放在回调中。 是的。你是完全正确的。但是使用 async/await 语法可能更舒服。所以你不会在某个时刻出现在回调地狱中)。【参考方案2】:

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

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

【讨论】:

以上是关于bcrypt.compare() 是异步的,这是不是一定意味着肯定会发生延迟? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

bcrypt.compare() 在验证密码时总是返回 false

等待 bcrypt.compare(req.body.password, user.password) 返回 false

无论密码如何,Bcrypt-NodeJS compare() 都会返回 false

护照和猫鼬的bcrypt错误

尝试在打字稿中使用猫鼬和 bcrypt 比较密码

api服务器思路