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