Le meilleur moyen de vérifier la mangouste erreur de validation
J'en ai deux validation fonctions pour ma usermodel
User.schema.path('email').validate(function(value, respond) {
User.findOne({email: value}, function(err, user) {
if(err) throw err;
if(user) return respond(false);
respond(true);
});
}, 'EMAIL_EXISTS');
et de même pour username
User.schema.path('username').validate(function(value, respond) {
User.findOne({username: value}, function(err, user) {
if(err) throw err;
if(user) return respond(false);
respond(true);
});
}, 'USERNAME_TAKEN');
De retourner des erreurs dans le format suivant
{ message: 'Validation failed',
name: 'ValidationError',
errors:
{ username:
{ message: 'Validator "USERNAME_TAKEN" failed for path username',
name: 'ValidatorError',
path: 'username',
type: 'USERNAME_TAKEN' } } }
L'erreur pour les email
chemin d'accès est similaire. Est-il une façon plus intelligente pour vérifier ces erreurs que le suivant?
if (err && err.errors && err.errors.username) { ... }
C'est le genre de laid.
Vous devez vous connecter pour publier un commentaire.
Techniquement, vous devez d'abord vérifier l'erreur de nom parce que pas toutes les erreurs sont traitées de la même manière. Ensuite, en fonction de l'erreur de nom, vous devez vérifier des propriétés particulières, comme les erreurs de la propriété qui vient avec une ValidationError.
Également vous mettre le nom du champ dans le type d'erreur et c'est redondant, il est préférable d'utiliser le même type d'erreur car dans la vérification des erreurs de procédure vous permettra d'obtenir le nom du champ également.
De sorte que votre code peut être quelque chose comme:
Et puis, la vérification des erreurs de procédure:
Si vous voulez raccourcir, vous avez différentes options. Si vous avez seulement un type de validation, vous pouvez le faire comme ceci:
L'expression minimale de l'erreur, vérifiez la procédure serait semblable à ce que vous avez écrit dans votre post:
Cela fonctionne parce que si des erreurs n'est pas défini, il va simplement ignorer le pour. Mais vous êtes ignorant tous les autres types d'erreur ici.
Je pense aussi que ces erreurs mises en page sont un peu la pagaille, mais ne vous attendez pas pour que cela change dans un avenir proche.
err instanceof mongoose.Error.ValidationError
dans votre erreur, la procédure de vérification.Il suffit d'écrire le code suivant et d'en profiter.
- Je utiliser AngularJS, donc
ngRepeat
affiche mes erreurs de validation sur le formulaire web. Tout ce que je dois faire est de retourner un tableau de messages d'erreur.Parfois Mangouste lèvera une erreur qui n'est PAS une erreur de validation, et dans ce cas, l'err.les erreurs de l'objet ne seront pas présents. I journal l'erreur d'exécution. J'utilise toujours le même endroit sur le formulaire web pour afficher l'exécution d'erreur à l'utilisateur.
J'ai trouvé ce utile qui affiche toutes les erreurs dans un tableau.
Par exemple, j'ai envoyé un formulaire à court de mot de passe et e-mail non valide.
Qui résultats dans ce
Si vous avez une virgule
,
dans vos messages d'erreur que d'essayer sans.split(',')
Pas besoin de
for
boucles. Assurez-vous que vous avez des messages d'erreur de validation dans votre schéma. Pour l'exemple ci-dessus j'aiPar la lecture de toutes ces réponses, je considère que c'est le meilleur pour créer la fonction d'utilité et la réutilisation en tant que tel:
C'est la fonction qui gère
ValidationError
par l'envoi de la réponse souhaitée pour le client avec les messages de validation, et éventuellementconsole.log
pour afficher les messages dans la console.Ensuite au contrôleur où nous voulons gérer l'erreur, nous vérifions si
err.name
estValidationError
, et, dans l'affirmative, nous utilisons la fonction d'utilité à partir de ci-dessus.Puis client d'obtenir la validation des erreurs de réponse en tant que telle:
De sortie:
Pourquoi n'utilisez-vous pas le
validation
méthode comme décrit dans l'API?This method is called pre save and if a validation rule is violated, save is aborted and the error is returned to your callback.
Donc c'est en gros ce que je fais déjà. Problème que j'ai est de la manipulation de laerr
sans trop de tracas.Ici mon unique moyen de gérer la mangouste erreur de validation
Le code est toujours en cours, une fois prêt, je vais le mettre à jour, ou vous pouvez contribuer étend mon code.
Approche #1
De mon Mieux Deviner de cette approche est l'utilisation généralisée du programme de validation avec promesse en fonction des retours,
espérons qu'il peut aider bas de la route
Approche #2
Utiliser le valider:Objet dans le schéma avec validator:fonction et message:String
Plus tard, quand u vous essayez d'enregistrer le dossier, il sera thow l'erreur de validation de l'objet dans la fonction capture
Par Exemple