使用expressJS检查数据库中的用户名和电子邮件

Ahm*_*gly 1 mongoose node.js express

我正在尝试检查数据库中是否已存在电子邮件和用户名。由于我使用的是mongoose和express.js,因此仅检查数据库中的用户名是否已存在,但是我需要检查电子邮件和用户名并为每个用户返回适当的错误消息。但是,我不知道如何检查它们。这是我到目前为止编写的一些代码:

User.findOne({
            'username': username
        },
        function(err, user) {

            if (err) {

                console.log('Signup error');
                return done(err);
            }

            //if user found.
            if (user) {

                console.log('Username already exists, username: ' + username);                                                             
                 var err = new Error();
                err.status = 310;
                return done(err);

            }
Run Code Online (Sandbox Code Playgroud)

tel*_*ziz 5

首先,您可能希望将此添加到架构中以确保所有电子邮件均为小写,因此进行比较很有意义:

email: { type: String, set: toLower } 
Run Code Online (Sandbox Code Playgroud)

降低到哪里:

function toLower (str) {
    return str.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

然后,要查找与用户名或电子邮件匹配的文档的MongoDB,可以使用 MongoDB $or运算符

因此查询将如下所示:

User.find($or:[{username: username}, {email: email}]);
Run Code Online (Sandbox Code Playgroud)

由于您使用的是猫鼬,因此我们可以使用pre Middleware来在保存之前验证文档

所以你的代码可能是这样的:

UserSchema.pre('save', function(next){
  var user = this ;
  User.find($or:[{username: user.username}, {email: user.email}],
            function(err, users){
    if(err) {
      return next(err);
    } else if(users) {
      if (_.find(users , {email: user.email})){
        user.invalidate('email', 'email is already registered'); 
        next( new Error("email is already registered"));
      }
      else if (_.find(users , {username: user.username})){
        user.invalidate('username', 'username is already taken'); 
        next( new Error("username is already taken"));
      }
    }
    else{
      next();
    }   
  })
})
Run Code Online (Sandbox Code Playgroud)

这可能无法涵盖所有​​情况,因此使用lodash表示简单性和令人敬畏