我在我的 mongoosejs ODM 模式中定义了一个自定义方法,它允许我生成盐并对给定的密码进行编码。
因为 node.js 加密模块是异步的,所以我必须将密码编码放入盐回调中(否则根本就没有盐,因为生成需要时间)。 但这不是主要问题。主要问题是我需要设置 mongoosejs 对象的盐和密码属性。通常您使用“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 语句,但它们没有返回任何东西......
最佳答案
您可以在回调外部将变量设置为 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;
});
});
}
}
或者您可以绑定(bind)回调函数,以便保留 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));
});
}
}
关于Javascript:如何在回调中设置父对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11555125/