3

我在我的 mongoosejs ODM 模式中定义了一个自定义方法,它允许我生成盐并对给定的密码进行编码。

因为 node.js 加密模块是异步的,所以我必须将密码编码放入 salt 回调中(否则根本没有 salt,因为生成需要时间)。但这不是主要问题。主要问题是我需要设置 mongoosejs 对象的 salt 和 password 属性。通常你用“this”来做这个,但“this”在回调中不起作用(它指的是回调而不是父对象)。

那么,我怎样才能从异步调用中取回我的编码密码和盐呢?

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                this.password = encodedPassword;
            });
        });
    }
}

我也尝试使用 return 语句,但它们不返回任何东西......

4

1 回答 1

7

您可以将变量设置为this回调外部并在内部使用它:

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var self = this;
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                self.password = encodedPassword;
            });
        });
    }
}

或者您可以绑定回调函数,以便this保留 的值:

methods: {
    setPassword: function(password) {
        crypto.randomBytes(32, function(err, buf) {
            var salt = buf.toString('hex');
            this.salt = salt;
            crypto.pbkdf2(password, salt, 25000, 512, function(err, encodedPassword) {
                if (err) throw err;
                this.password = encodedPassword;
            }.bind(this));
        });
    }
}
于 2012-07-19T06:34:35.773 回答