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.hashSync() 函数。由于 bcrypt 很好,因为它很耗时,所以为了不阻塞代码,使用异步函数不是更明智,即:

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

你能解释一下哪种方式更好,为什么?谢谢!

4

3 回答 3

8

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

于 2012-07-23T04:11:16.520 回答
2

您不能在同步方法中进行异步调用。尝试设置密码时使用单独的方法。

我刚刚提交了一个拉取请求,所以有人的项目正是这样做的。在这里查看:https ://github.com/nickpoorman/CrowdNotes/commit/e268c80a9cacddbc0215bf0e2b7aa31c0a4c785f

于 2012-08-31T23:39:41.970 回答
0

这是一个基准,显示异步hash()比同步快 2.3 倍hashSync()https ://jinoantony.com/blog/async-vs-sync-nodejs-a-simple-benchmark

我真的不知道这种加速的原因是什么,因为该函数严格受 CPU 限制,没有 I/O。也许异步版本能够在引擎盖下利用多个核心?这可能是一个可能的解释。我自己运行了这个基准测试,并在一台 8 核的机器上获得了一致的 4 倍加速。

于 2021-12-10T17:29:57.983 回答