Mongoose验证 - 执行多个自定义验证

时间:2015-05-09 02:21:52

标签: javascript node.js mongodb 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}
});

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

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

我的问题是:如果我想使用像validator这样的模块来验证输入是否是电子邮件,我将如何进行此操作?我知道我可以要求模块并执行类似validator.isEmail(email)的操作并获得布尔值作为回报,但是如何将其与我当前的设置集成?

2 个答案:

答案 0 :(得分:2)

最简单的方法就是在Log.Logger = new LoggerConfiguration() .WriteTo.RollingFile(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\app-{Date}.log") .WriteTo.ColoredConsole() .MinimumLevel.Debug() .CreateLogger(); HostFactory.Run(x => { // configure TopShelf to use Serilog's global instance. x.UseSerilog(); } 方法中检查它。如果电子邮件无效,它将返回验证错误。

validate

此处有一些建议使用var validator = require('validator'); // Validate email address userSchema .path('email') .validate(function (value) { return validator.isEmail(value); }, 'Email is invalid'); 检查电子邮件的唯一性:

constructor

答案 1 :(得分:0)

最简单的方法是在架构中使用RegEx来验证它是否是有效的电子邮件。然后使用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}
});