【发布时间】:2017-06-08 22:08:13
【问题描述】:
我正在尝试验证登录表单。现在我正在努力让用户名和电子邮件验证部分正常工作。
这两个字段都应该是唯一的,正如我的架构中指定的那样。
var userSchema = new mongoose.Schema({
username: {type:String,required:true,trim:true,unique:true},
password:{type:String,required:true},
email:{type:String,required:true,unique:true},
verified:{type:Boolean,required:true},
dateCreated:{type:Date,default:Date.now}
});
我还在架构上定义了一个静态方法。
userSchema.statics.validateSignUp = function(username,useremail,password,passwordConfirmation,callback,next){
var isValid = true;
var User = this;
var errorObject = {};
if(username.trim().length >= 5){
//check to see if username already exists
User.findOne({'username': username}).exec(function(err,user){
if(err){
return next(err);
}
if(user){
isValid = false;
errorObject.username = 'Username is already taken.';
}
});
}else{
isValid = false;
errorObject.username = 'Username must be at least 5 chars long.';
}
//check to see if password is greater than 5 characters
//if not add to responseJson errors
if(password.length < 5){
isValid = false;
errorObject.password = 'Password must be at least 5 chars long.';
}
//check password confirmation
if(password !== passwordConfirmation){
isValid = false;
errorObject.passwordConfirm = 'Passwords do not match.';
}
//check email against regex
var emailRe = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if(emailRe.test(useremail)){
User.findOne({'email':useremail}).exec(function(err,user){
if(err){
return next(err);
}
if(user){
isValid = false;
errorObject.email = 'User with this email already exists.';
}
});
}else{
isValid = false;
errorObject.email = 'Email is not valid.';
}
if(!isValid){
console.log('not valid')
return errorObject;
}else{
console.log('valid')
callback()
}
}
代码应该在尝试通过回调函数保存之前查看数据库中是否已经存在用户名和电子邮件。但是,当我测试它时,该方法会不断返回 isValid = true。我认为这是由于 Node 的异步特性。如果是这样,处理这类事情的好方法是什么?
【问题讨论】:
标签: node.js forms mongodb express mongoose