2012-07-19 55 views
1

我有問題,鹽生成和密碼編碼已準備好,當文檔已保存。 => mongoosejs不會等到哈希完成,所以我們在數據庫中沒有密碼和鹽(但我可以console.log他們:)。貓鼬ODM:無法保存編碼的密碼,因爲異步

有什麼可以避免這種行爲嗎?

  1. 服務員的功能?
  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); 
    }); 
}); 

回答

1

你會想encodePassword採取回調,所以你可以調用它,當你完成。

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); 
     }); 
    }); 
}); 
+0

嘿,由於某些原因,這仍然不起作用。我假設UserSchema.methods.encodePassword沒有對模型的語義訪問。我會檢查這個 – bodokaiser 2012-07-19 07:38:14

+0

我會問在貓鼬谷歌組。文檔是簡約的方式。但是,我永遠不知道何時以及如何通過setter,方法,插件來訪問模型屬性 – bodokaiser 2012-07-19 07:49:52