【问题标题】:Mongoose Validation - perform multiple custom validationsMongoose Validation - 执行多个自定义验证
【发布时间】:2015-07-20 01:04:35
【问题描述】:

我有一个基本的猫鼬模式:

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) 之类的操作并获得一个布尔值作为回报,但是如何将它与我当前的设置集成?

【问题讨论】:

    标签: javascript node.js mongodb validation mongoose


    【解决方案1】:

    最简单的方法是在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');
    

    【讨论】:

      【解决方案2】:

      最简单的方法是在架构中使用 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}
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-25
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 2018-06-11
        • 2017-09-10
        • 2014-04-06
        相关资源
        最近更新 更多