Как добавить проверку на дочерний элемент mongoose в схеме?

node.js validation mongoose

957 просмотра

3 ответа

6 Репутация автора

Извините, если это очевидно, но я гуглил в течение нескольких часов, и большая часть результатов связана с sub-document / nested-schema, которая относится к массиву объектов, а не к моему случаю.

Для простоты я просто создаю минимальный объект, но концепция та же самая.

У меня есть схема Мангуста следующим образом, я хочу проверить объект отца с помощью validateFunction, которая validateFunction просто проверяет, существует ли firstName / lastName:

var PersonSchema = new Schema({
  firstName : String,
  lastName : String, 
  father : {
    firstName: String,
    lastName: String
 }, 
  mother : {
    firstName: String,
    lastName: String
 }
};

я пытался

var PersonSchema = new Schema({
  firstName : String,
  lastName : String, 
  father : {
    type: {
      firstName: String,
      lastName: String
    },
    validate : validateFunction
  }, 
  mother : {
    firstName: String,
    lastName: String
  }
};

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

Может кто-нибудь указать мне правильный способ добавить проверку на дочерний объект (отец)?

Примечание: я проверил этот SO, который похож, но я не хочу хранить «папа» в отдельной коллекции, поскольку «Персона» - единственный объект, использующий «папу», поэтому я думаю, что папа находится внутри объекта «Персона». ,

Изменить: я проверил предложение @Azeem со следующим кодом:

var log = function (val) {
    console.log(val);
    return true ;
}
var validateFunction = function (val) {
    if (typeof val === 'undefined') {
        return false;
    }
    console.log(typeof val, val);
    return true;
}
var many = [
    { validator: log, msg: 'fail to log' },
    { validator: validateFunction, msg: 'object is undefined' }
];
var PersonSchema = new Schema({
  firstName : String,
  lastName : String, 
  father : {
    firstName: String, 
    lastName: {type : String }
    validate : many // following http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate
  }, 
    mother : {
    firstName: String,
    lastName: String
     }
  });

var PersonModel = mongoose.model("PersonTest", PersonSchema);

var josephus = new PersonModel({firstName:'Josephus', father:{lastName:null}});
josephus.save(function(error) {
    console.log("testing", error);
})

и получил ошибку

***/index.js:34
    validate : many
    ^^^^^^^^
SyntaxError: Unexpected identifier
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:945:3

если схема меняется на следующую, она работает (докажите, что функция проверки работает правильно)

var PersonSchema2 = new Schema({
  firstName : String,
  lastName : String, 
  father : {
    firstName: String, 
    lastName: {type : String ,validate : many}

  }, 
    mother : {
    firstName: String,
    lastName: String
     }
  });
Автор: Josephus Yang Источник Размещён: 19.07.2016 07:20

Ответы (3)


0 плюса

684 Репутация автора

У меня есть пример, где я помещаю небольшую проверку в мою схему Moongoose, надеюсь, это может помочь.

var UserType = require('../defines/userType');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

//Schema for User
var UserSchema = new Schema({
     name: {
          type: String,
          required: true
     },
     email: {
          type: String
     },
     password: {
          type: String,
          required: true
     },
     dob: {
          type: Date,
          required: true
     },
     gender: {
          type: String, // Male/Female
          required: true
          default: 'Male'
     },
     type: {
         type: Number,
         default: UserType.User
     },

    address:{
        streetAddress:{
             type: String,
             required: true
        },
        area:{
             type: String
        },
        city:{
             type: String,
             required: true
        },
        state:{
             type: String,
             required: true
        },
        pincode:{
             type: String,
             required: true
        },
    },
    lastLocation: {
        type: [Number], // [<longitude>, <latitude>]
        index: '2d',    // create the geospatial index
        default: [77.2166672, 28.6314512]
    },
    lastLoginDate: {
        type: Date,
        default: Date.now
    },

});

//Define the model for User
var User;
if(mongoose.models.User)
    User = mongoose.model('User');
else
    User = mongoose.model('User', UserSchema);

//Export the User Model
module.exports = User;

Таким образом, вы можете добавить дополнительную проверку. В вашем запросе Монго, просто проверьте

db.collection.validate(function(err){
     if(err){
          console.log(err);    //if your validation fails,you can see the error.   
     }
});
Автор: Ajitej Kaushik Размещён: 19.07.2016 07:38

0 плюса

316 Репутация автора

Попробуй это

 var PersonSchema = new Schema({
  firstName : String,
  lastName : String, 
    father : {
    firstName: String, 
    lastName: String  
    validate : validateFunction
  }, 
    mother : {
    firstName: String,
    lastName: String
     }
  };
Автор: Azeem Malik Размещён: 19.07.2016 07:49

0 плюса

6 Репутация автора

Решение

Обязательные валидаторы на вложенных объектах

Документы mongoose на самом деле предлагают использовать вложенную схему, чтобы мы могли выполнить проверку объекта.

var ParentSchema = new Schema({
    firstName: String,
    lastName: String
 });
var PersonSchema = new Schema({
  firstName : String,
  lastName : String, 
  father : {
    type: ParentSchema, 
    validate : validateFunction
  }, 
  mother : {
    type: ParentSchema, 
    validate : validateFunction
  }
};

Это должно сделать трюки и сделать проверку.

Автор: Josephus Yang Размещён: 25.08.2016 07:34
Вопросы из категории :
32x32