2017-02-22 7 views
0

私は以前に登録した電子メールの登録を防止しようとしています。私はmongooseスキーマでカスタム検証を作成しようとしました。それは私にエラーをもたらしましたValidationError:ユーザー検証に失敗しました at MongooseError.ValidationError。コードは下にあります。ある人が、エラーがどこにあるか、またはユーザーの電子メールがdbに存在するかどうかを調べるためのより良い方法を教えてくれますか?電子メールのユーザーが既に存在するかどうかを確認する方法?

// 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

私は昨日simillarの質問に答えました。見てください:http://stackoverflow.com/questions/42362970/insert-document-only-if-not-already-exists/42363555#42363555 –

答えて

1

電子メールIDが既に明示-バリデータを使用しているデータベースに存在するかどうかをチェックするための最良の方法。 バージョン4にアップグレードすると、APIが変更されました。さて、代わりに使用したの : - あなたのapp.jsファイル..in

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

、その後はミドルウェアを呼び出します。代わりに、ちょうどあなたのユーザー・ルート・ファイルに次の操作を行います -

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

関連する問題