在完成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');
每次以任何方式访问userSchema
时,userSchema.path('email').validate
也会触发并验证电子邮件字符串。这个验证也可以在userSchema
对象中完成,除非它非常混乱。
.validate(function(value, next)...
中,value
是电子邮件字符串,next
没有任何内容,未定义。 (右?)
如果是这样,那么我看不到return next(false)
或next(!user)
如何运作。
我在其他情况下熟悉next
,但next
在这做什么?
答案 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')
赞同你的观点:
value
是电子邮件,因此请使用更好的变量命名,并将其命名为email
,而不是value
; next
就是这样一个功能:“继续下一步。”!user
为false
;如果用户不存在,则!user
为true
。如果next
传递了false-y值,则认为存在错误。真值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 })
})
答案 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');