2017-07-20 1 views
0

J'ai un schéma mongoose où je stocke un numéro de port. J'ai également une valeur par défaut définie pour le champ.Mongoose accepte null pour le champ Numéro

port:{ 
    type:Number, 
    default:1234 
} 

Si je ne reçois pas de valeur via mon API, il se prépare à 1234. Toutefois, si quelqu'un envoie null, il accepte null et enregistre dans la base de données. Ne devrait-il pas couvrir null à 1234? null n'est pas un nombre! Est-ce que je comprends mal?

Je considère la solution donnée here, mais je ne veux pas ajouter du code supplémentaire pour quelque chose qui devrait fonctionner sans elle (à moins que je me trompe et que ce ne est pas censé convertir null à 1234)

+1

Il est plus d'un [artefact JavaScript] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/null) que les bases des "types" en mangouste sont basées. Cela dépend donc si vous pouvez soit vivre en lançant simplement une exception (ce que vous pouvez faire avec un simple validateur) soit en supplantant 'null' avec une valeur" par défaut "où il est fourni, ce qui est fait dans les crochets" pré ". . Ou assurez-vous plutôt que les entrées sont 'undefined' au lieu de' null', et que le "default" fonctionne comme prévu. –

+0

Est-ce que [ma réponse] (https://stackoverflow.com/questions/45208127/mongoose-accepts-null-for-number-field/45211501#45211501) ci-dessous vous a aidé? Des commentaires? – rsp

Répondre

0

Voir les commentaires dans ce numéro:

null est une valeur valide pour une propriété Date, sauf si vous spécifiez required. Les valeurs par défaut ne sont définies que si la valeur est indéfinie, et non si elle est falsifiée.

(il s'agit de dates mais il peut aussi être appliqué aux nombres.)

Vos options sont soit:

  • ajouter required au champ
  • ajouter un validateur personnalisé qui rejeter
  • utiliser des crochets/middleware pour résoudre le problème

Vous pourriez vous en sortir avec un crochet de pré-sauvegarde ou de post-validation (ou un autre) comme celui-ci:

YourCollection.pre('save', function (next) { 
    if (this.port === null) { 
    this.port = undefined; 
    } 
    next(); 
}); 

mais probablement vous devrez utiliser quelque chose comme:

YourCollection.pre('save', function (next) { 
    if (this.port === null) { 
    this.port = 1234; // get it from the schema object instead of hardcoding 
    } 
    next(); 
}); 

Voir aussi cette réponse pour quelques trucs sur la façon de faire null déclencher des valeurs par défaut dans l'invocation de la fonction:

Ceci est dommage que Mongoose ne puisse pas être configuré pour marcher null comme undefined (avec un paramètre ou quelque chose comme ça « non nulle ») car il est parfois le cas que vous travaillez avec des données que vous avez une demande JSON et il peut parfois convertir undefined null:

> JSON.parse(JSON.stringify([ undefined ])); 
[ null ] 

ou même ajouter des valeurs null où il n'y avait pas (explicite) undefined:

> JSON.parse(JSON.stringify([ 1,,2 ])); 
[ 1, null, 2 ]