mongoosevalidation – 执行多个自定义validation

我有一个基本的mongoose模式:

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

我执行一个自定义的validation器,调用一个小的服务(在另一个文件中)来查找电子邮件地址是否已被使用:

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

我的问题是:如果我想用validation器这样的模块来validationinput是否是电子邮件,那我该怎么做呢? 我知道我可以要求模块,并做一些像validator.isEmail(email)并得到一个布尔值作为回报,但我怎么能整合这与我目前的设置?

最简单的方法就是在validate方法中检查它。 如果电子邮件无效,它将返回validation错误。

 var validator = require('validator'); // Validate email address userSchema .path('email') .validate(function (value) { return validator.isEmail(value); }, 'Email is invalid'); 

这里有一些build议使用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'); 

最简单的方法是在模式中使用RegEx来validation它是否是有效的电子邮件。 然后使用UserSchema.pre('save' function...)来validation电子邮件是否已被使用。 这将作为在注册方法中被调用的中间件。

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