2012-08-01 110 views
1

我正在嘗試使用Express和Mongoose爲用戶輸入做一些驗證。以前,我在用戶模型的'密碼'字段直接設置了'最小長度'驗證程序。它會檢查輸入的密碼字符串是否足夠長,如果不是,則會將其傳遞給嘗試保存用戶時創建的ValidationError對象。這將被髮回給用戶,並顯示在適當的表單域中。貓鼬錯誤處理

但現在,我已經實現了哈希,鹽和加密,這並不完全正常工作。散列版本的密碼比原始密碼長很多。所以,我想我可以做這樣的事情:

exports.createNewUser = function(req, res, next){ 

    var user = new User({ 
      email : req.body.email 
     , name : req.body.name 
    }) 
    , minLength = Validator.minLength(req.body.password); 

    if (!minLength) return next(new Error('Password aint right length')); 

    user.setPassword(req.body.password); 

    user.save(function(err){ 
     if (!err) return res.redirect('/'); 
     else { 
      console.log('error saving usr', err); 
      err['body'] = req.body; 
      return res.render('user/register', err); 
     } 
    }); 
}; 

的問題是,

return next(new Error('err message')); 

僅僅是在控制檯上顯示。我需要一些方法將它附加到貓鼬驗證錯誤對象。有任何想法嗎?

回答

1

看了一下後,我找到了一個解決方案。基本上,您可以在嘗試保存之前調用模型上的「驗證」功能。然後,您可以將其他驗證應用於未必在您的模型中設置的其他屬性。在這種情況下,我正在測試非哈希密碼字符串的長度,以查看它是否足夠長。如果不是,則向返回的err對象添加一個對象。然後可以將其發送回表單。

user.validate(function(err){ 
     if (req.body.password.length < 20) { 
      err.errors.password = { type : 'the pw should be longer'}; 
     } 
     console.log(err); 
    });