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

check if user name and email in database using expressJS

我正在尝试检查数据库中的电子邮件和用户名是否已经存在。因为我使用的是 mongoose 和 express.js,所以我只检查了数据库中的用户名是否已经存在,但我需要检查电子邮件和用户名以及 return 每个人的合适的错误消息。但是,我不知道如何检查它们。以下是我到目前为止编写的一些代码:

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

            }

使用 find() 函数,这可能会给你完美的结果

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

        if (err) {

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

        //if user found.
        if (user.length!=0) {
          if(user[0].username){
            console.log('Username already exists, username: ' + username);                         
             }else{
                console.log('EMAIL already exists, email: ' + email);      
             }                                    
             var err = new Error();
            err.status = 310;
            return done(err);

        }

首先,您可能希望将此添加到您的架构中,以确保所有电子邮件都是小写的,这样比较才有意义:

email: { type: String, set: toLower } 

toLower 在哪里:

function toLower (str) {
    return str.toLowerCase();
}

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

所以查询将是这样的:

User.find($or:[{username: username}, {email: email}]);

由于您使用的是猫鼬,我们可以使用 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();
    }   
  })
})

这可能无法涵盖所有​​情况,为简单起见,使用 lodash

您可以在 Schema Mongoose 中使用索引来创建唯一的用户名和电子邮件。 或者您可以在此处阅读更多内容:http://mongoosejs.com/docs/2.7.x/docs/indexes.html