node.js - 如何使用两个独特的 Mongoose 处理验证

标签 node.js mongodb express

我是 mongoose 和 nodejs 的初学者。我在 Mongoose 中有两个独特的字段,我如何用它进行验证。这是我的代码:

型号

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');
    });

我尝试了上面的代码,但不幸的是它不起作用。第一次时,我尝试发布唯一的电子邮件,它有效,但之后,我收到错误重复 key 错误发送后无法设置 header 。我不确定路由器中的代码。谁能告诉我我应该做什么?

最佳答案

这是因为一旦您无法为单个请求多次发送响应。

在您的情况下,第一次创建电子邮件和用户名并且它们已成功保存,但下次当您传递相同的电子邮件和用户名时,它会进入这种情况

if(user){
   res.json({message:'Email already exists'})
   next()
}

并返回响应,然后检查用户名。它再次进入条件

if(user){
   res.json({message:'Username already exists'})
   next()
}

并尝试返回一个响应,该响应会引发此错误。

编辑

处理此类情况有多种方法。我将根据我从您的问题中了解到的内容来解释其中之一。另外,最好正确遵循 MVC 实践。让查询位于模型中。

现在您使用电子邮件、用户名和密码创建一个用户。创建时您还想确保电子邮件和用户名是唯一的。

路由器.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"
    }
});

模型.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

关于node.js - 如何使用两个独特的 Mongoose 处理验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43911993/

相关文章:

node.js - 如果 mongodb 类型是字符串,查询仅返回文档

mongodb - Graphql 为 Mongoose 聚合查询返回空 ID

node.js - Mongodb 查询不适用于字符串

node.js - 如何在 Keystone.js 数据库 ODM 中创建字符串数组?

node.js - 上传前在 Multer 中验证

node.js - 浏览器未通过 BrowserSync 或实时服务器启动

javascript - 如何在 perl 的 JE 引擎中实现 "JS' s require"函数?

javascript - Passportjs 获取身份验证错误消息

javascript - 如何处理 Express Session?

node.js - 如何修复此项目中的 "zone is not defined"