0
在通過MEAN堆棧教程時,我發現自己對以下貓鼬驗證碼感到困惑。模式驗證函數如何在貓鼬中工作?
用戶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
對象中完成,除非它非常混亂。in
.validate(function(value, next)...
,value
是電子郵件字符串,並且next
什麼也沒有給出,並且是未定義的。 (對吧?)如果是這樣,那麼我看不到
return next(false)
或next(!user)
可以工作。我在其他情況下熟悉
next
,但next
在這裏做什麼?
感謝您的回答。它使得某些事情更加清晰 - 但我的代碼中的「接下來」似乎仍然沒有意義。爲什麼不自己返回'false'或'!user'?那些簡單的布爾人是否不足以作爲'驗證'來完成工作的答案? – dwilbank
,在你的例子中#4 ...「下一步」被定義爲'在頁面上寫下的任何代碼'?這是我混亂的根源。在我的代碼中,沒有預定的「下一個」任務要做。 – dwilbank
「下一步」可能只是「一切都好嗎?」如果沒有,則會拋出錯誤「'該電子郵件已被使用」。此外,你可以'返回false',因爲代碼是異步的。如果返回false,它只會將值返回給lambda函數'function(err,user){/ * etc * /}',而不是驗證函數。 – royhowie