模式验证函数如何在mongoose中工作?

时间:2015-07-20 20:58:44

标签: javascript mongoose

在完成MEAN堆栈教程时,我发现自己对以下猫鼬验证码感到困惑。

user-service.js

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

user.js的

var userService = require('../services/user-service');

var userSchema = new Schema({  
    ...
    email:      {type: String, required: 'Please enter your email'},
    ...
});

userSchema.path('email')
    .validate(function(value,next){
        userService.findUser(value, function(err, user){
            if(err){
                console.log(err);
                return next(false);
            }
            next(!user);
        });
    }, 'That email is already in use');
  1. 每次以任何方式访问userSchema时,userSchema.path('email').validate 会触发并验证电子邮件字符串。这个验证也可以在userSchema对象中完成,除非它非常混乱。

  2. .validate(function(value, next)...
  3. value是电子邮件字符串,next没有任何内容,未定义。 (右?)

  4. 如果是这样,那么我看不到return next(false)next(!user)如何运作。

  5. 我在其他情况下熟悉next,但next在这做什么?

2 个答案:

答案 0 :(得分:1)

以下是它的工作原理:

userSchema.path('email').validate(function (email, next) {
    // look for a user with a given email
    // note how I changed `value` to `email`
    userService.findUser(email, function (err, user) {
        // if there was an error in finding this user
        if (err) {
            console.log(err)
            // call next and pass along false to indicate an error
            return next(false)
        }
        // otherwise, call next with whether or not there is a user
        // `user === null` -> then `!user === true`
        // `user === { someObject }` -> then `!user === false`
        return next(!user)
    })
    // error message
}, 'That email is already in use')

赞同你的观点:

  1. 是的,此功能验证电子邮件路径。
  2. 是的,value是电子邮件,因此请使用更好的变量命名,并将其命名为email,而不是value; next就是这样一个功能:“继续下一步。”
  3. 请参阅上面代码中的注释。但是,tldr:如果存在该电子邮件的用户,则!userfalse;如果用户不存在,则!usertrue。如果next传递了false-y值,则认为存在错误。真值y意味着一切都还好。
  4. 它称之为“下一步”。例如

    app.get('/admin*', function (req, res, next) {
        req.status = 'I was here!'
        next()
    })
    
    app.get('/admin/users/view', function (req, res, next) {
        console.log(req.status)    // ==> 'I was here!'
        res.render('admin/users/view.jade', { someLocals })
    })
    

答案 1 :(得分:1)

userSchema.path('email_id').validate(function(value, done) {    
this.model('User').count({ email_id: value }, function(err, count) {
    if (err) {
        return done(err);
    } 
    // If `count` is greater than zero, "invalidate"
    done(!count);
});
}, 'Email already exists');