validation - route - La validación de Joi devuelve solo un mensaje de error
joi validation (3)
La clave de validation
ya no funciona con el constructor Hapi.Server
en Hapi 8.0:
[1] la validación no está permitida
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);
});
Tengo un formulario de tres campos formado por un campo de nombre, un campo de correo electrónico y un área de texto. Estoy usando la versión Joi 4.7.0 junto con hapijs. Yo uso el siguiente objeto para validar la entrada. Recibo el objeto de datos de una llamada ajax. Cuando lleno los tres campos con información incorrecta, solo recibo el mensaje relativo al primer campo incorrecto. Como eso:
"{"statusCode":400,"error":"Bad Request","message":"name is not allowed to be empty","validation": {"source":"payload","keys":["data.name"]}}"
validate: {
payload: {
data: {
name: Joi.string().min(3).max(20).required(),
email: Joi.string().email().required(),
message: Joi.string().min(3).max(1000).required()
}
}
}
Para una explicación, supongamos que no rellenar los tres campos Recibo solo un mensaje de error y no el mensaje de error de los otros campos. ¿Por qué?
No me estoy integrando con hapi.js, pero noté que hay un objeto ValidationOptions
que se puede transmitir. Dentro de ese objeto hay una opción abortEarly
, así 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 ver más ValidationOptions
: https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts
Sucede porque Joi aborta temprano por defecto.
abortEarly
: cuando estrue
, detiene la validación en el primer error, de lo contrario devuelve todos los errores encontrados. Por defecto estrue
.
* EDITAR: La configuración ha cambiado en hapi 8.0. abortEarly: false
agregar abortEarly: false
a la configuración de routes
:
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 más detalles.
* También, vea la validation
en las opciones de ruta Hapi .
Así que 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 devolver todos los errores. Para esto, necesitas establecer abortEarly
en 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, obtendrá:
{ 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'' ] } }