web-dev-qa-db-fra.com

Rendre tous les champs obligatoires dans Mongoose

Mongoose semble par défaut pour rendre tous les champs non requis. Est-il possible de rendre tous les champs obligatoires sans changer chacun des éléments suivants:

Dimension = mongoose.Schema(
  name: String
  value: String
)

à

Dimension = mongoose.Schema(
  name:
    type: String
    required: true
  value: 
    type: String
    required: true
)

Ça va devenir vraiment moche puisque j'en ai beaucoup.

16
maxko87

J'ai fini par faire ceci:

r_string = 
  type: String
  required: true 

r_number = 
  type: Number
  required: true

et sur pour les autres types de données. 

9
maxko87

Vous pourriez faire quelque chose comme:

var schema = {
  name: { type: String},
  value: { type: String}
};

var requiredAttrs = ['name', 'value'];

for (attr in requiredAttrs) { schema[attr].required = true; }

var Dimension = mongoose.schema(schema);

ou pour tous les attrs (en utilisant le trait de soulignement, ce qui est génial):

var schema = {
  name: { type: String},
  value: { type: String}
};

_.each(_.keys(schema), function (attr) { schema[attr].required = true; });

var Dimension = mongoose.schema(schema);
10

Toutes les propriétés des champs sont dans schema.paths[attribute] ou schema.path(attribute);

Une bonne façon de procéder: définir quand un champ n'est PAS requis, 

Schema = mongoose.Schema;
var Myschema = new Schema({
    name : { type:String },
    type : { type:String, required:false }
})

et les rendre tous requis par défaut:

function AllFieldsRequiredByDefautlt(schema) {
    for (var i in schema.paths) {
        var attribute = schema.paths[i]
        if (attribute.isRequired == undefined) {
            attribute.required(true);
        }
    }
}

AllFieldsRequiredByDefautlt(Myschema)

La voie de soulignement:

_=require('underscore')
_.each(_.keys(schema.paths), function (attr) {
    if (schema.path(attr).isRequired == undefined) {
        schema.path(attr).required(true);
    }
})

Essaye-le :

MyTable = mongoose.model('Myschema', Myschema);
t = new MyTable()
t.save()
4
Flint

Eh bien, vous pouvez écrire une fonction de plug-in de schéma mangouste qui parcourt l'objet de schéma et l'ajuste pour rendre chaque champ obligatoire. Ensuite, vous aurez juste besoin d'une ligne par schéma: Dimension.plugin(allRequired).

3
Peter Lyons

Mongoose n'a pas fourni la méthode de définition de tous les champs, mais vous pouvez le faire de manière récursive.

Comme Peter l'a mentionné, vous pouvez le brancher pour pouvoir réutiliser le code.

Réglage récursif:

// game.model.js
var fields = require('./fields');
var Game = new Schema({ ... });

for(var p in Game.paths){
  Game.path(p).required(true);
}

Pluginized:

// fields.js
module.exports = function (schema, options) {
  if (options && options.required) {
    for(var p in schema.paths){
      schema.path(p).required(true);
    }
  }
}

// game.model.js
var fields = require('./fields');
var Game = new Schema({ ... });
Game.plugin(fields, { required: true });
2
chuyik

Je ne sais pas s'il existe un moyen plus facile de le faire dans Mongoose, mais je ferais ce qui suit dans votre IDE/éditeur:

Listez vos champs comme vous le feriez normalement:

Dimension = mongoose.Schema(
  name: String
  value: String
)

Faites ensuite une recherche et remplacez-la sur String et remplacez-la par {type: String, required: true},.

Dimension = mongoose.Schema(
  name: {type: String, required: true},
  value:  {type: String, required: true},
)

Faites de même pour Number et les autres types.

0
Samuel O'Malley

En se basant sur les réponses précédentes, le module ci-dessous créera des champs par défaut. Les réponses précédentes ne récifiaient pas les objets/tableaux imbriqués.

Usage:

const rSchema = require("rschema");

var mySchema = new rSchema({
    request:{
        key:String,
        value:String
    },
    responses:[{
        key:String,
        value:String
    }]
});

Module de nœud:

const Schema = require("mongoose").Schema;

//Extends Mongoose Schema to require all fields by default
module.exports = function(data){
    //Recursive
    var makeRequired = function(schema){
        for (var i in schema.paths) {
            var attribute = schema.paths[i];
            if (attribute.isRequired == undefined) {
                attribute.required(true);
            }
            if (attribute.schema){
                makeRequired(attribute.schema);
            }
        }
    };

    var schema = new Schema(data);
    makeRequired(schema);
    return schema;
};
0
koga73