web-dev-qa-db-fra.com

Node.js + Joi comment afficher un message d'erreur personnalisé?

Il semble assez simple de valider la saisie de l'utilisateur dans Node.js RESTapi avec Joi.

Mais le problème est que mon application n'est pas écrite en anglais. Cela signifie que je dois envoyer un message écrit personnalisé à l'utilisateur frontal.

J'ai googlé pour cela et n'ai trouvé que des problèmes.

Peut-être que quelqu'un pourrait donner une solution à cela?

C'est le code que j'utilise pour valider avec le système Joi:

    var schema = Joi.object().keys({
      firstName: Joi.string().min(5).max(10).required(),
      lastName: Joi.string().min(5).max(10).required()
      ..
    });

    Joi.validate(req.body, schema, function(err, value) {
      if (err) {
        return catched(err.details); 
      }
    });

    function catched(reject) {
      res.json({
        validData: false,
        errors: reject
      });
    }

De plus, y a-t-il un moyen d'utiliser Joi du côté client?

Merci!

15
Raz

Une solution que j'ai trouvée consiste à définir:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
  lastName: Joi.string().min(5).max(10).required()
  ..
});

Puis imprimez la variable label à partir du rappel error

16
Raz

Étendre sur réponse d'Ashish Kadam , si vous avez plusieurs types d'erreur différents, vous pouvez vérifier quel type d'erreur est présent et définir son message en conséquence:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.type) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = `Value should have at least ${err.context.limit} characters!`;
          break;
        case "string.max":
          err.message = `Value should have at most ${err.context.limit} characters!`;
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});

Vous pouvez vérifier la liste des erreurs ici: Référence de l'API Joi 14.3.1> Erreurs> Liste des erreurs

Vous pouvez aussi consulter la référence any.error pour plus d'informations. Citation de la documentation:

Remplace l'erreur joi par défaut par une erreur personnalisée si la règle échoue où:

  • err peut être:
    • une instance de Error - l'erreur de substitution.
    • a function(errors), prenant comme argument un tableau d'erreurs, où il faut soit:
      • retourne un string - remplace le message d'erreur par ce texte
      • retourne un seul object ou un Array de celui-ci, où:
        • type - paramètre facultatif fournissant le type de l'erreur (par exemple. number.min).
        • message - paramètre facultatif si template est fourni et contient le texte de l'erreur.
        • template - paramètre facultatif si message est fourni, contenant une chaîne de modèle et utilise le même format que les erreurs de langage joi habituelles.
        • context - paramètre facultatif, pour fournir un contexte à votre erreur si vous utilisez template.
      • renvoyer un Error - comme lorsque vous fournissez directement un Error, mais vous pouvez personnaliser le message d'erreur en fonction des erreurs.
  • options:
    • self - Valeur booléenne indiquant si le gestionnaire d'erreurs doit être utilisé pour toutes les erreurs ou uniquement pour les erreurs survenant sur cette propriété (true valeur). Ce concept n'a de sens que pour les schémas array ou object, car les autres valeurs n'ont pas d'enfants. La valeur par défaut est false.
21
Guillermo Gutiérrez

Joi Version 14.0.

const SchemaValidation = {
  coins: Joi.number()
    .required()
    .error(() => {
      return {
        message: 'Coins is required.',
      };
    }),
  challenge_name: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge name is required.',
      };
    }),
  challengeType: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge type is required.',
      };
    }),
  challengeDescription: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge description is required.',
      };
    }),
};

Dans errors vous pouvez obtenir un objet, le type d'erreur et modifier le message en fonction.

18
Ashish Kadam

Vous pouvez utiliser . Erreur (nouvelle erreur ('message')), et son travail pour moi

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for first name')),
  lastName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for last name'))
  ..
});

Joi.validate(req.body, schema, function(err, value) {
  if (err) {
    console.log(err.message)
    return catched(err.message); 
  }
});
9
Sameer Ek

let schema = Joi.object ({foo: Joi.number (). min (0) . error (() => '"foo" nécessite un nombre positif') });

Docs lien

3
Max Sherbakov

Solution pour ajouter des messages personnalisés: Ajoutez simplement une autre fonction chaînée pour générer une erreur lors de la définition de votre schéma.
Dans ton cas

 firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),

Reste restera le même.

Solution pour utiliser Joi côté client (Votre 2ème question)

Joi-Browser est le package qui permet d’utiliser le même schéma côté client.

Ici est une discussion intéressante que vous pouvez consulter.

À votre santé!

2
let schema = Joi.object().keys({
   Joi.string().required().options({language: {any: {required: "First name is required"}}})
});
1
yatinsmile