我是mongoose和nodejs的初学者。我在猫鼬中有两个独特的领域,我该如何验证它。这是我的代码:
模型
var userSchema = new Schema({
local:{
email:{type:String,required:true,unique:true},
username:{type:String,required:true,unique:true},
password:{type:String,required:true}
}
});
路由器
User.findOne({'local.email':req.body.email},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Email already exists'})
next()
}
});
User.findOne({'local.username':req.body.username},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Username already exists'})
next()
}
})
newUser = new User;
newUser.local.email = req.body.email;
newUser.local.username = req.body.username;
newUser.local.password=req.body.password;
newUser.save(function(err){
if(err) console.log(err)
res.json('Register Success');
});
我尝试上面的代码,但遗憾的是它不起作用。第一次,我尝试发布唯一的电子邮件,它工作,但在它之后,我收到错误duplicate key error
。 Cant set header after they are send
。我不确定路由器中的代码。任何人都可以告诉我该怎么做?
答案 0 :(得分:2)
那是因为一旦您无法为单个请求多次发送响应。
在您的情况下,您第一次创建电子邮件&用户名和保存成功,但下次当您传递相同的电子邮件和用户名时,它会进入此状态
if(user){
res.json({message:'Email already exists'})
next()
}
并返回响应,然后检查用户名。它再次进入条件
if(user){
res.json({message:'Username already exists'})
next()
}
并尝试返回一个引发此错误的响应。
修改强>
有各种方法可以处理这种情况。我将从你从你的问题中理解的方式解释其中一个。此外,最好正确遵循MVC实践。让查询在模型中。
现在您使用电子邮件,用户名和密码创建用户。在创建时,您还希望确保电子邮件和用户名是唯一的。
router.js
User.findDuplicate({'email':req.body.email, 'username' req.body.username},function(err,user){
if(err) console.log(err)
if(user){ // send duplicate message as entry exists
if(user.local.email === req.body.email){
res.json({message:'Email already exists'})
}else if((user.local.username === req.body.username){
res.json({message:'Username already exists'})
}
}else{
// save the new user details
// save query and return "Register Success"
}
});
model.js
var userSchema = new Schema({
local:{
email:{type:String,required:true,unique:true},
username:{type:String,required:true,unique:true},
password:{type:String,required:true}
}
});
userSchema.statics.findDuplicate = function(res, callback){
this.findOne({$or:[{"local.email":res.email},{"local.username":res.username}]},callback);
}
// don't forget to register the model and export it and then require it in the router.js
答案 1 :(得分:1)
执行嵌套函数(瀑布)代码或使用中间件函数(更多详细信息Middleware in node js)
<?= $form->field($category, 'id')->dropDownList($categoryList, [
'id' => 'category-id',
'prompt' => 'Choose a category',
]); ?>
<?= $form->field($model, 'item_id')->widget(DepDrop::classname(), [
'options'=>['id'=>'item-id'],
'pluginOptions'=>[
'depends'=>['category-id'],
'placeholder'=> 'Choose an item',
'url'=>Url::to(['/sale/subcat'])
]
]); ?>
<?= $form->field($model, 'price') ?>
使用中间件:
router
User.findOne({'local.email':req.body.email},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Email already exists'})
next()
}else{
User.findOne({'local.username':req.body.username},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Username already exists'})
next()
}else{
newUser = new User;
newUser.local.email = req.body.email;
newUser.local.username = req.body.username;
newUser.local.password=req.body.password;
newUser.save(function(err){
if(err) console.log(err)
res.json('Register Success');
});
}
})
}
});
并在router.createUser:
中app.route('/create-user',checkUniqueuser, router.createUser);//example route given
function checkUniqueuser(req, res, next){
User.findOne({'local.email':req.body.email},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Email already exists'})
}else{
User.findOne({'local.username':req.body.username},function(err,user){
if(err) console.log(err)
if(user){
res.json({message:'Username already exists'})
}else{
next();
}
})
}
});
}