Javascript 模式验证函数在mongoose中是如何工作的?
在阅读MEAN stack教程时,我发现自己对以下mongoose验证代码感到困惑 用户服务.jsJavascript 模式验证函数在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');
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
只是一个表示“继续下一步”的函数!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
。