Mongoose ODM:由于asynchronous,无法保存编码的密码

当文档已经存在时,我有盐生成和密码编码已经准备好的问题。 => mongoosejs不等到哈希结束,所以我们在数据库中没有密码和盐(但我可以console.log他们:)。

有什么可以避免这种行为?

  1. 一个服务员的function?
  2. 还是应该将编码部分移动到一些预保存中间件?

编码方法

UserSchema.methods.encodePassword = function(password) { crypto.randomBytes(32, function(err, buf) { this.salt = buf.toString('hex'); console.log(this.salt); crypto.pbkdf2(password, this.salt, 25000, 512, function(err, encodedPassword) { if (err) throw err; this.password = encodedPassword; console.log(this.password); }.bind(this)); }); }; 

路线行动

 // creates a new user app.post('/users', function(req, res) { // create new user var user = new User(); // assign post user.username = req.body.username; user.email = req.body.email; user.encodePassword(req.body.password); user.save(function(err, user) { console.log(user); if (!err) return res.send(err, 500); return res.json(user); }); }); 

您需要encodePassword进行callback,以便在完成时调用它。

 UserSchema.methods.encodePassword = function(password, callback) { crypto.randomBytes(32, function(err, buf) { this.salt = buf.toString('hex'); console.log(this.salt); crypto.pbkdf2(password, this.salt, 25000, 512, function(err, encodedPassword) { if (err) return callback(err); this.password = encodedPassword; console.log(this.password); callback(); }.bind(this)); }); }; 

现在你可以等待它在你的路线上完成。

 app.post('/users', function(req, res) { // create new user var user = new User(); // assign post user.username = req.body.username; user.email = req.body.email; user.encodePassword(req.body.password, function(err) { if(err) { /* handle error */ } user.save(function(err, user) { console.log(user); if (!err) return res.send(err, 500); return res.json(user); }); }); });