Te damos la respuesta a este asunto, o por lo menos eso creemos. Si sigues con interrogantes puedes escribirlo en el apartado de comentarios, que sin dudarlo te responderemos
Solución:
respuesta original:
La forma actual (personalmente la encuentro mejor) es usar .messages()
(o .prefs(messages)
).
const Joi = require('@hapi/joi');
const joiSchema = Joi.object(
a: Joi.string()
.min(2)
.max(10)
.required()
.messages(
'string.base': `"a" should be a type of 'text'`,
'string.empty': `"a" cannot be an empty field`,
'string.min': `"a" should have a minimum length of #limit`,
'any.required': `"a" is a required field`
)
);
const validationResult = joiSchema.validate( a: 2 , abortEarly: false );
console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'
Uso de .errors()
no se recomienda solo actualizar el mensaje predeterminado con un mensaje personalizado.
.prefs( messages )
es una forma elaborada de proporcionar más opciones como preferencias. Las otras opciones de preferencias se toman directamente de las opciones de .validate()
Lea más: https://github.com/hapijs/joi/issues/2158
Actualización 1: Vi que la explicación anterior no funcionó para algunas personas, así que puse un código para probarlo. Compruébalo aquí: https://runkit.com/embed/fnfaq3j0z9l2
También se actualizó el fragmento de código compartido anteriormente para tener detalles desde la inclusión del paquete hasta el uso y la llamada al método de validación real.
Actualización 2: La lista de tipos de errores joi y su descripción (por .messages()
– me gusta string.base, array.unique, date.min, etc.) está disponible aquí.
Actualización 3: Joi pasó del proyecto hapi al independiente: https://www.npmjs.com/package/joi. Asegúrese de estar utilizando la última versión (o al menos superior a v17).
Ampliando la respuesta de Ashish Kadam, si tiene muchos tipos de error diferentes, puede verificar qué tipo de error está presente y configurar su mensaje en consecuencia:
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;
),
// ...
);
Puede consultar la lista de errores aquí: Joi 14.3.1 Referencia API > Errores > Lista de errores
También puedes consultar la any.error
referencia para más información. Citando los documentos:
Anula el error joi predeterminado con un error personalizado si la regla falla donde:
err
puede ser:
- una instancia de
Error
– el error de anulación.- un
function(errors)
tomando un array de errores como argumento, donde debe:
- devolver un
string
– sustituye el mensaje de error con este texto- devolver un solo
object
o unArray
de ella, donde:
type
– parámetro opcional que proporciona el tipo de error (p.number.min
).message
– parámetro opcional sitemplate
se proporciona, que contiene el texto del error.template
– parámetro opcional simessage
se proporciona, que contiene una plantilla stringutilizando el mismo formato que los errores habituales de lenguaje joi.context
– parámetro opcional, para proporcionar contexto a su error si está utilizando eltemplate
.- devolver un
Error
– igual que cuando usted proporciona directamente unError
pero puede personalizar el mensaje de error en función de los errores.options
:
self
– Valor booleano que indica si el controlador de errores debe usarse para todos los errores o solo para los errores que ocurren en esta propiedad (true
valor). Este concepto sólo tiene sentido paraarray
oobject
esquemas como otros valores no tienen hijos. Predeterminado afalse
.
Joi Versión 14.0.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.',
;
),
;
En errores objeto que puede obtener, tipo de error y cambio de mensaje según.