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

Javascript 模式验证函数在mongoose中是如何工作的?,javascript,mongoose,Javascript,Mongoose,在阅读MEAN stack教程时,我发现自己对以下mongoose验证代码感到困惑 用户服务.js exports.findUser = function(email, next){ User.findOne({email:email.toLowerCase()}, function(err,user){ next(err, user); }) }; var userService = require('../services/user-service');

在阅读MEAN stack教程时,我发现自己对以下mongoose验证代码感到困惑

用户服务.js

exports.findUser = function(email, next){
    User.findOne({email:email.toLowerCase()}, function(err,user){
        next(err, user);
    })
};
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');
user.js

exports.findUser = function(email, next){
    User.findOne({email:email.toLowerCase()}, function(err,user){
        next(err, user);
    })
};
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');
  • 每次以任何方式访问
    userSchema
    ,都会触发并验证电子邮件字符串。这个验证也可以在
    userSchema
    对象中完成,除非它非常混乱

  • .validate(函数(值,下一个)…
    中,
    value
    是电子邮件字符串,
    next
    没有给出任何内容,并且未定义。(对吗?)

  • 如果是这样,那么我看不出
    returnnext(false)
    next(!user)
    如何工作

  • 我熟悉其他情况下的
    next
    ,但是
    next
    在这里做什么

  • 下面是它的工作原理:

    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')
    
    按照您的观点:

  • 是,此功能验证电子邮件路径
  • 是的,
    value
    是电子邮件,因此使用更好的变量命名,并将其称为
    email
    ,而不是
    value
    next
    只是一个表示“继续下一步”的函数
  • 请参阅上面代码中的注释。但是,tldr:如果存在具有该电子邮件的用户,则
    !user
    false
    ;如果该用户不存在,
    !user
    true
    。如果
    next
    传递了一个false-y值,则认为存在错误。truth-y值表示一切正常
  • 它称为“下一步”

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

  • 谢谢你的回答。它让某些事情变得更清楚了——但是我的代码中的“下一步”似乎仍然毫无意义。为什么不自己返回“false”或“!user”?这些简单的布尔值不足以作为“.validate”完成其工作的答案吗?在你的示例中,#4…下一步”步骤定义为“写在页面下方的任何代码”?这是我困惑的根源。在我的代码中,没有预定的“下一步”任务要做。“下一步”可以是“一切正常吗?”如果没有,则错误为“该电子邮件已在使用”被抛出。另外,您可以
    返回false
    ,因为代码是异步的。如果您返回false,它只会将值返回给lambda函数
    函数(err,user){/*etc*/}
    ,不是验证函数。明白了。不过您的上一条评论可能有输入错误。“can”应该是“cannot”。谢谢!正确。我的意思是说
    cannot