Saltar al contenido

La validación de Joi devuelve solo un mensaje de error

Comprende el código bien antes de utilizarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en los comentarios.

Solución:

Sucede porque Joi aborta temprano por defecto.

abortEarly – Cuándo true, detiene la validación en el primer error, de lo contrario devuelve todos los errores encontrados. Predeterminado a true.

*EDITAR: La configuración ha cambiado en hapi 8.0. Necesitas agregar abortEarly: false al routes configuración:

var server = new Hapi.Server();
server.connection(
    host: 'localhost',
    port: 8000,
    routes: 
        validate: 
            options: 
                abortEarly: false
            
        
    
);

*Consulte la documentación de la API de Joi para obtener más detalles.
*Ver también validation en las opciones de la ruta Hapi.

Entonces Joi detiene la validación en el primer error:

var Hapi = require('hapi');
var Joi = require('joi');

var server = new Hapi.Server('localhost', 8000);

server.route(
    method: 'GET',
    path: '/first/second',
    config: 
        validate: 
            params: 
                first: Joi.string().max(5),
                second: Joi.string().max(5)
            
        
    ,
    handler: function (request, reply) 

        reply('example');
    
);

server.start();

server.inject('/invalid/invalid', function (res) 

    console.log(res.result);
);

Salidas:

 statusCode: 400,
  error: 'Bad Request',
  message: 'first length must be less than or equal to 5 characters long',
  validation:  source: 'params', keys: [ 'first' ]  

Sin embargo, puede configurar Hapi para que devuelva todos los errores. Para ello, debe establecer abortEarly a false. Puedes hacer esto en la configuración del servidor:

var server = new Hapi.Server('localhost', 8000,  validation:  abortEarly: false  );

Si ejecuta el script ahora, obtiene:

 statusCode: 400,
  error: 'Bad Request',
  message: 'first length must be less than or equal to 5 characters long. second length must be less than or equal to 5 characters long',
  validation:  source: 'params', keys: [ 'first', 'second' ]  

No me estoy integrando con hapi.js, pero noté que hay un ValidationOptions objeto que se puede pasar. Dentro de ese objeto hay un abortEarly opción, por lo que esto debería funcionar:

Joi.validate(request, schema, abortEarly: false

Esto también se puede configurar de la siguiente manera:

Joi.object().options( abortEarly: false ).keys(...);

Consulte estas definiciones de tipo para obtener más ValidationOptions: https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts

El validation key ya no funciona con el Hapi.Server constructor en Hapi 8.0:

[1] no se permite validar

Encontré la solución en un problema de GitHub para hapi:

var Hapi = require('hapi');


var server = new Hapi.Server();

server.connection(
  host: HOST,
  port: PORT,
  routes: 
    validate: 
      options: 
        abortEarly: false
      
    
  
);

// Route using Joi goes here.
server.route();

server.start(function () 
  console.log('Listening on %s', server.info.uri);
);

Si te animas, tienes el poder dejar una reseña acerca de qué te ha gustado de esta secció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 *