Как проверить два поля в документе при регистрации в Express.js , mongodb?

#node.js #mongodb #express #mongoose #mongoose-schema

#node.js #mongodb #выразить #мангуст #мангуст-схема

Вопрос:

Я разработал схему для пользователя и времени регистрации, я проверяю, существует ли электронная почта (уникальная) или нет.если я уже зарегистрирован, я отправляю сообщение mes ‘адрес электронной почты уже используется’. теперь все работает нормально, я хочу проверить два поля email и mobilenumber. как я могу этого добиться?? помогите мне

ниже приведен мой полный дизайн пользовательской схемы

     'use strict';

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    var UserSchema = new Schema({
        name: String,
        mobilenumber : String,
        email: {
            type: String,

        },
        hashedPassword: String,
        provider: String,
        salt: String,
    });

    /**
     * Virtuals
     */
    UserSchema
      .virtual('password')
      .set(function(password) {
        this._password = password;
        this.salt = this.makeSalt();
        this.hashedPassword = this.encryptPassword(password);
      })
      .get(function() {
        return this._password;
      });

    // Public profile information
    UserSchema
      .virtual('profile')
      .get(function() {
        return {
          'name': this.name,
          'role': this.role
        };
      });

    // Non-sensitive info we'll be putting in the token
    UserSchema
      .virtual('token')
      .get(function() {
        return {
          '_id': this._id,
          'role': this.role
        };
      });

    /**
     * Validations
     */

    // Validate empty email
    UserSchema
      .path('email')
      .validate(function(email) {
        if (authTypes.indexOf(this.provider) !== -1) return true;
        return email.length;
      }, 'Email cannot be blank');

    // Validate empty password
    UserSchema
      .path('hashedPassword')
      .validate(function(hashedPassword) {
        if (authTypes.indexOf(this.provider) !== -1) return true;
        return hashedPassword.length;
      }, 'Password cannot be blank');

    // Validate email is not taken
    UserSchema
        .path('email')
        .validate(function(value, respond) {
            var self = this;
            this.constructor.findOne({
                email: value
            }, function(err, user) {
                if (err) throw err;
                if (user) {
                    if (self.id === user.id) return respond(true);
                    return respond(false);
                }
                respond(true);
            });
        }, 'email address is already in use.');

    var validatePresenceOf = function(value) {
        return value amp;amp; value.length;
    };


/**
 * Pre-save hook
 */
UserSchema
  .pre('save', function(next) {
    if (!this.isNew) return next();

    if (!validatePresenceOf(this.hashedPassword) amp;amp; authTypes.indexOf(this.provider) === -1)
      next(new Error('Invalid password'));
    else
      next();
  });

/**
 * Methods
 */
UserSchema.methods = {
  /**
   * Authenticate - check if the passwords are the same
   *
   * @param {String} plainText
   * @return {Boolean}
   * @api public
   */
  authenticate: function(plainText) {
    return this.encryptPassword(plainText) === this.hashedPassword;
  },

  /**
   * Make salt
   *
   * @return {String}
   * @api public
   */
  makeSalt: function() {
    return crypto.randomBytes(16).toString('base64');
  },

  /**
   * Encrypt password
   *
   * @param {String} password
   * @return {String}
   * @api public
   */
  encryptPassword: function(password) {
    if (!password || !this.salt) return '';
    var salt = new Buffer(this.salt, 'base64');
    return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
  }
};

module.exports = mongoose.model('User', UserSchema);
 

во время регистрации, если пользователь ввел уже зарегистрированный код электронной почты или номера мобильного телефона, должна появиться ошибка типа «адрес электронной почты уже используется» или «номер мобильного телефона уже используется». если оба или совпадают «электронная почта и номер мобильного телефона уже используются», помогите мне?

Ответ №1:

Вместо проверки поля вы должны создать метод для проверки как электронной почты, так и номера мобильного телефона. Проверьте код ниже:

 UserSchema.statics.validateMobileAndEmail= function (email, mobileNumber, cb) {
  return this.find({email: email, mobileNumber: mobileNumber}).exec(function(err, user){
    if(err) return cb(err);

    if(user.email === email amp;amp; user.mobileNumber === mobileNumber){
       return cb(null, 'email and mobilenumber already exists');
    } else if(user.email === email ){
       return cb(null, 'email already exists');
    } else if(user.mobileNumber === mobileNumber){
       return cb(null, ' mobilenumber already exists');
    } 
    return cb();
 })
}
 

и перед созданием записи вызовите ее по электронной почте и номеру мобильного телефона.

 UserSchema.validateMobileAndEmail(email, mobileNumber, function(err, msg){
   if(err){ return res.json({error:'internal server error'});}
   else if(msg) {return res.json({error: msg});}
   else{
      // register user code
   }

})
 

пример.

 UserSchema.validateMobileAndEmail('email@email.com', '2222222222', function(err, msg){
       if(err){ return res.json({error:'internal server error'});}
       else if(msg) {return res.json({error: msg});}
       else{
          // register user code
       }

    })
 

Комментарии:

1. что я должен написать внутри этой функции ‘UserSchema.validateMobileAndEmail’

2. я получаю сообщение об ошибке UserSchema.validateMobileAndEmail(электронная почта, номер мобильного телефона, функция (ошибка, сообщение об ошибке){ ^ Ошибка ссылки: адрес электронной почты не определен

3. передайте эти значения при вызове метода.

4. я не понял, сэр. вы имеете в виду req.body.email и req.body.mobilenumber, которые мне нужно передать, верно?

5. UserSchema.validateMobileAndEmail(‘sujitha@gmail.com ‘, ‘9687567895’, функция (ошибка, сообщение об ошибке){ ^ Ошибка типа: UserSchema.validateMobileAndEmail не является функцией… я получаю ошибку, подобную этой

Ответ №2:

Вы можете получить проверку для обоих полей, но mongoose покажет вам ошибку первой неудачной проверки, она не покажет обе ошибки проверки вместе.

Если существует как электронная почта, так и мобильный телефон, он покажет вам, что адрес электронной почты уже используется. потому что mongoose остановится при сбое первой проверки.

Если вас это устраивает, просто добавьте ту же проверку для мобильных устройств под проверкой электронной почты.

 UserSchema
    .path('mobilenumber')
    .validate(function(value, respond) {
        var self = this;
        this.constructor.findOne({
            mobilenumber : value
        }, function(err, user) {
            if (err) throw err;
            if (user) {
                if (self.id === user.id) return respond(true);
                return respond(false);
            }
            respond(true);
        });
    }, 'mobile is already in use.');
 

В противном случае вы можете поместить пользовательскую проверку в свой код.