在node.js中生成哈希值时,应使用异步还是同步bcrypt函数?

8

我目前正在尝试为我的node.js项目制作认证模块。

我已经看过了一些使用bcrypt生成哈希值的例子,例如:

https://github.com/bnoguchi/mongoose-auth/blob/master/lib/modules/password/plugin.js https://github.com/Turbo87/locomotive-passport-boilerplate/blob/master/app/models/account.js

然而,由于bcrypt很耗时,它们为什么要使用bcrypt.hashSync()函数呢?难道不应该使用异步函数以防止阻塞代码吗?例如:

User.virtual('password')
.get( function () {
    return this.hash;
})
.set( function (password) {
    bcrypt.hash('password', 10, function(err, hash) {
        this.hash = hash;
    });
});

您能否解释一下哪种方法更好,为什么?谢谢!

3个回答

8

如果可能的话,您应该使用异步版本,这样在密码哈希期间就不会占用您的节点处理。在您引用的这两个源代码案例中,代码使用同步版本,因为它所使用的方法是同步的,所以作者别无选择,只能使用同步版本。


3
+1,异步绝对是正确的选择;使用像Mongoose这样的ODM时需要注意的一件事是,getter和setter不能是异步的,因此有些作者会在其中使用同步方法。这通常是错误的做法;过去我曾在模型上使用自定义方法,如setPassword来进行异步密码设置。 - Michelle Tilley
@BrandonTilley,你能给一个你自定义方法的例子吗? - Steve Lorimer
3
噢,好吧,自从我发布这篇文章以来已经有一段时间了,但类似于这样的东西似乎很接近:https://gist.github.com/BinaryMuse/7983335 - Michelle Tilley

2

0

下面的基准测试显示异步hash()比同步的hashSync()要快2.3倍https://jinoantony.com/blog/async-vs-sync-nodejs-a-simple-benchmark

我不太清楚这个加速的原因,因为该函数严格绑定在CPU上,没有I/O操作。也许异步版本能够在后台利用多核心?这可能是一个合理的解释。我在一台8核机器上运行了这个基准测试,并得到了持续的4倍加速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接