关于bcrypt npm package,我看到建议使用异步版本。但是,我想真正理解两个版本在性能方面的差异(即事件循环,阻塞I / O等)
版本1:异步
const hash = await bcrypt.hash(...)
...
版本2:同步
const hash = bcrypt.hashSync(...)
...
换句话说,如果我用bcrypt.hash
呼叫await
,效果是否等同于同步版本?
答案 0 :(得分:2)
同步与异步版本的不同之处在于它们使用底层同步与异步盐生成。所以异步熵收集。
https://github.com/kelektiv/node.bcrypt.js/blob/7a720bd2e5450f97e64d4a1d4ac23190b1417c65/bcrypt.js#L30 https://github.com/kelektiv/node.bcrypt.js/blob/7a720bd2e5450f97e64d4a1d4ac23190b1417c65/bcrypt.js#L76
然后将散列卸载到工作线程以获取异步散列。
https://github.com/kelektiv/node.bcrypt.js/blob/aac593c3922253c732bb62197913a26a8302fbe6/src/bcrypt_node.cc#L216 https://github.com/kelektiv/node.bcrypt.js/blob/aac593c3922253c732bb62197913a26a8302fbe6/src/bcrypt_node.cc#L241
所以是的,它确实使用异步并且会避免阻塞节点事件循环
答案 1 :(得分:1)
我不知道bcrypt究竟是如何实现它的,但如果推荐它并且它确实是完全异步的,那就意味着它们在不同的线程中执行它并且它不会阻塞主线程。
在Node.js中,事件循环和你编写的所有代码都在一个线程中 - 一旦你开始做某事,同步部分必须首先完全执行,这意味着其他一切都被阻止了。 你不想阻止你的REST API进行响应,对吗?每个毫秒计数。
答案 2 :(得分:0)
您可以使用bcrypt.hash()使其异步,如下所示:
bcrypt.hash(password,saltRounds).then(hash)=>{
//run whatever you want here once the operation has completed, such as creating your user
}