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.
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.
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);
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()
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)
.
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 });
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.
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;
};