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!
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
É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 unArray
de celui-ci, où:
type
- paramètre facultatif fournissant le type de l'erreur (par exemple.number.min
).message
- paramètre facultatif sitemplate
est fourni et contient le texte de l'erreur.template
- paramètre facultatif simessage
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 utiliseztemplate
.- renvoyer un
Error
- comme lorsque vous fournissez directement unError
, 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émasarray
ouobject
, car les autres valeurs n'ont pas d'enfants. La valeur par défaut estfalse
.
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.
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);
}
});
let schema = Joi.object ({foo: Joi.number (). min (0) . error (() => '"foo" nécessite un nombre positif') });
Docs lien
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é!
let schema = Joi.object().keys({
Joi.string().required().options({language: {any: {required: "First name is required"}}})
});