2017-02-22 151 views
0

我正试图阻止以前注册的电子邮件注册。我试图在猫鼬模式中创建一个自定义验证。但它给了我一个错误ValidationError:用户验证失败 在MongooseError.ValidationError。代码在下面。有人可以告诉我错误在哪里,或者更好的方法来检查用户电子邮件是否存在于数据库中。如何检查使用电子邮件的用户是否已经存在?

// user schema 
var UserSchema = mongoose.Schema({ 
    username: { 
     type: String, 
     index: true, 
     require: true 
    }, 
    password: { 
     type: String, 
     require: true 
    }, 
    email: { 
     type: String, 
     lowercase: true, 
     trim: true, 
     index: { 
      unique: true, 
     }, 
     validate: { 
      validator : isEmailExists, msg: 'Email already exists' 
     } 
    }, 
    name: { 
     type: String 
    }, 
    admin: Boolean, 
    active: Boolean, 
}); 

// validation 
function isEmailExists(email, callback) { 
    if (email) { 
     mongoose.models['User'].count({ _id: { '$ne': this._id }, email: email }, function (err, result) { 
      if (err) { 
       return callback(err); 
      } 
      callback(!result); 
     }) 
    } 
} 
// createUser function 
module.exports.createUser = function(newUser, callback){ 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(newUser.password, salt, function(err, hash) { 
      newUser.password = hash; 
      newUser.save(callback); 
     }); 
    }); 
} 

路由器

router.post('/register', function(req, res, next) { 
    var name = req.body.name; 
    var email = req.body.email; 
    var password = req.body.password; 
    var confirmedPassword = req.body.confirmedPassword; 

    // Validation 
    req.checkBody('name', 'Name is required').notEmpty(); 
    req.checkBody('email', 'Email is required').notEmpty(); 
    req.checkBody('email', 'Email is not valid').isEmail(); 
    req.checkBody('password', 'Password is required').notEmpty(); 
    req.checkBody('confirmedPassword', 'Passwords do not match').equals(req.body.password); 

    var errors = req.validationErrors(); 

    if (errors) { 
     res.render('register', { 
      errors: errors 
     }); 
    } else { 
     var newUser = new User({ 
      name: name, 
      email: email, 
      password: password, 
      admin: false, 
      active: false 
     }); 

     User.createUser(newUser, function (err, user) { 
      if (err) { 
       throw err; 
      } 
     }); 

     req.flash('success_msg', 'You are registerd and can now login'); 
     res.redirect('/users/login'); 
    } 
+0

保存功能在哪里? – digit

+0

我昨天回答了一个类似的问题。看看:http://stackoverflow.com/questions/42362970/insert-document-only-if-not-already-exists/42363555#42363555 –

回答

1

检查电子邮件ID已经在数据库中使用明文验证器的存在与否是最好的方式。 由于升级到版本4,API已更改。 现在,而不是使用: -

const expressValidator = require('express-validator'); 

..in你app.js文件,然后调用中间件。相反,只是这样做在你的用户路由文件: -

const { check, validationResult } = require('express-validator/check'); 

现在,检查电子邮件ID在数据库中已经存在,你将不得不使用承诺。这里是一个工作代码: -

 router.post('/register', [ 
      check('name') 
      .not() 
      .isEmpty() 
      .withMessage('Name is required'), 
      check('email') 
      .not() 
      .isEmpty() 
      .withMessage('Email is required') 
      .isEmail() 
      .withMessage('Invalid Email') 
      .custom((value, {req}) => { 
      return new Promise((resolve, reject) => { 
       User.findOne({email:req.body.email}, function(err, user){ 
       if(err) { 
        reject(new Error('Server Error')) 
       } 
       if(Boolean(user)) { 
        reject(new Error('E-mail already in use')) 
       } 
       resolve(true) 
       }); 
      }); 
      }), 
      // Check Password 
      check('password') 
      .not() 
      .isEmpty() 
      .withMessage('Password is required'), 
      // Check Password Confirmation 
      check('confirmedPassword', 'Passwords do not match') 
      .exists() 
      .custom((value, { req }) => value === req.body.password) 
     ], function(req, res) { 
      var name = req.body.name; 
      var email = req.body.email; 
      var password = req.body.password; 
      var confirmedPassword = req.body.confirmedPassword; 

      // Check for Errors 
      const validationErrors = validationResult(req); 
      let errors = []; 
      if(!validationErrors.isEmpty()) { 
      Object.keys(validationErrors.mapped()).forEach(field => { 
       errors.push(validationErrors.mapped()[field]['msg']); 
      }); 
      } 

      if(errors.length){ 
      res.render('register',{ 
       errors:errors 
      }); 
      } else { 
      var newUser = new User({ 
       name: name, 
       email: email, 
       password: password, 
       admin: false, 
       active: false 
      }); 

      User.createUser(newUser, function (err, user) { 
       if (err) { 
       throw err; 
       } 
      }); 

      req.flash('success_msg', 'You are registerd and can now login'); 
      res.redirect('/users/login'); 
      } 

你可以同样做这个检查用户名也。 Here is the link to the official GitHub page of express-validator

相关问题