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ándotrue
, detiene la validación en el primer error, de lo contrario devuelve todos los errores encontrados. Predeterminado atrue
.
*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.