Saltar al contenido

Node.js + Joi, ¿cómo mostrar mensajes de error personalizados?

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 un Array de ella, donde:
        • type – parámetro opcional que proporciona el tipo de error (p. number.min).
        • message – parámetro opcional si template se proporciona, que contiene el texto del error.
        • template – parámetro opcional si message 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 el template.
      • devolver un Error – igual que cuando usted proporciona directamente un Errorpero 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 para array o object esquemas como otros valores no tienen hijos. Predeterminado a false.

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *