2015-05-09 71 views
2

我有一個基本的貓鼬架構:貓鼬驗證 - 執行多個自定義驗證

var userSchema = new Schema({ 
    userName: {type: String, required: 'Please enter a username'}, 
    email: {type: String, required: 'Please enter email'}, 
    password: {type: String, required: 'Please create a password'}, 
    created: {type: Date, default: Date.now} 
}); 

我進行調用小服務(在另一個文件),自定義驗證發現如果電子郵件地址已在使用:

userSchema.path('email').validate(function(value, next) { 
    userService.findUser(value, function(err, user) { 
     if (err) { 
      console.log(err); 
      return next(false); 
     } 
     next(!user); 
    }); 
}, 'Already exists'); 

這裏是findUser方法:

exports.findUser = function(email, next) { 
    User.findOne({email: email.toLowerCase()}, function(err, user) { 
     next(err, user); 
    }); 
}; 

我的問題是:如果我竟被d喜歡使用像validator這樣的模塊來驗證輸入是否爲電子郵件,我將如何去做這件事?我知道我可以要求該模塊,並執行validator.isEmail(email)之類的操作,並得到一個布爾值作爲回報,但是如何將此與我的當前設置進行整合?

回答

2

最簡單的方法就是檢查一下validate的方法。如果電子郵件無效,它將返回驗證錯誤。

var validator = require('validator'); 

// Validate email address 
userSchema 
    .path('email') 
    .validate(function (value) { 

    return validator.isEmail(value); 

    }, 'Email is invalid'); 

這裏有些建議,使用constructor檢查電子郵件的唯一性:

// Validate that email is not taken 
userSchema 
    .path('email') 
    .validate(function (value, respond) { 
    var self = this; 

    this.constructor.findOne({email: value}, function (err, user) { 
     if (err) { 
     return respond(false); 
     } 

     if (user) { 
     if (self.id === user.id) { 
      return respond(true); 
     } 
     return respond(false); 
     } 
     respond(true); 
    }); 
    }, 'Already exists'); 
0

最簡單的方法是使用正則表達式的模式來驗證它是否是一個有效的電子郵件。然後使用UserSchema.pre('save' function...)驗證電子郵件是否已被使用。這將充當在註冊方法中被調用的中間件。

var userSchema = new Schema({ 
    userName: {type: String, required: 'Please enter a username'}, 
    email: {type: String, required: 'Please enter email'}, 
    password: { 
      type: String, 
      match: [/.+\@.+\..+/, "Please fill a valid email address"], 
      required: 'Please create a password'}, 
      created: {type: Date, default: Date.now} 
});