Проверка Joi возвращает только одно сообщение об ошибке
у меня есть форма из трех полей, состоящая из поля имени, поля электронной почты и текстового поля. Я использую версию Joi 4.7.0 вместе с hapijs. Я использую объект ниже для проверки ввода. Я получаю объект данных из вызова ajax. Когда я заполняю все три поля неправильной информацией, я получаю только сообщение относительно первого неправильного поля. Вот так:
"{"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()
}
}
}
для объяснения предположим, что не заполнять три поля. Я получаю только одно сообщение об ошибке, а не сообщение об ошибке других полей. Почему?
3 ответов
это происходит потому, что Joi прерывается рано по умолчанию.
abortEarly
- когдаtrue
, останавливает проверку при первой ошибке, в противном случае возвращает все найденные ошибки. По умолчанию:true
.
* EDIT: конфигурация изменилась в hapi 8.0. Вам нужно добавить abortEarly: false
до routes
config:
var server = new Hapi.Server();
server.connection({
host: 'localhost',
port: 8000,
routes: {
validate: {
options: {
abortEarly: false
}
}
}
});
*см.документация по API Joi для получения более подробной информации.
*Кроме того, см. validation
под варианты маршрута Hapi.
таким образом, Joi останавливает проверку при первой ошибке:
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);
});
выходы:
{ statusCode: 400,
error: 'Bad Request',
message: 'first length must be less than or equal to 5 characters long',
validation: { source: 'params', keys: [ 'first' ] } }
однако вы можете настроить Hapi для возврата всех ошибок. Для этого вам нужно установить abortEarly
to false
. Вы можете сделать это в конфигурации сервера:
var server = new Hapi.Server('localhost', 8000, { validation: { abortEarly: false } });
если вы запустите скрипт сейчас, вы получите:
{ 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' ] } }
на validation
ключ больше не работает с Hapi.Server
конструктор в Hapi 8.0:
[1] проверка не допускается
Я нашел решение в выпуск GitHub для 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);
});
Я не интегрируюсь с hapi.JS, но я заметил, что есть ValidationOptions
объект, который может быть передан вместе. Внутри этого объекта находится , Так что это должно работать:
Joi.validate(request, schema, {abortEarly: false}
Это также можно настроить следующим образом:
Joi.object().options({ abortEarly: false }).keys({...});
проверьте эти определения типов для более ValidationOptions
:
https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts