如何使用两个独特的猫鼬进行验证

时间:2017-05-11 09:50:03

标签: node.js mongodb express

我是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 errorCant set header after they are send。我不确定路由器中的代码。任何人都可以告诉我该怎么做?

2 个答案:

答案 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();           

          }
        })


     }
   });

}