В библиотеке Joi механизм обработки ошибок валидации по умолчанию
работает в режиме раннего прерывания. Это означает, что при обнаружении
первой ошибки в структуре данных дальнейшая проверка остальных правил не
выполняется. Такое поведение напрямую связано с опцией
abortEarly, которая управляет стратегией сбора ошибок.
Ключевая настройка, влияющая на процесс валидации, задаётся через параметр:
abortEarly: true — режим по умолчаниюabortEarly: false — накопление всех ошибокПри значении true валидация прекращается сразу после
первой найденной ошибки. При значении false анализ
продолжается до конца схемы, и возвращается полный список всех
нарушений.
Стандартная конфигурация приводит к следующему сценарию: при проверке объекта анализируются поля по очереди, и как только обнаруживается несоответствие схеме, процесс завершается.
Пример схемы:
import Joi from 'joi';
const schema = Joi.object({
username: Joi.string().min(3).required(),
age: Joi.number().min(18).required(),
email: Joi.string().email().required()
});
const result = schema.validate(
{ username: 'ab', age: 15, email: 'invalid' }
);
При стандартных настройках будет возвращена только первая ошибка, например:
username не удовлетворяет минимальной длинеПроверка age и email выполнена не
будет.
Режим с остановкой на первой ошибке применяется в сценариях, где:
Такой подход снижает объём вычислений, поскольку не требует анализа всей структуры данных после обнаружения критического несоответствия.
Отключение раннего завершения меняет стратегию обработки:
const schema = Joi.object({
username: Joi.string().min(3).required(),
age: Joi.number().min(18).required(),
email: Joi.string().email().required()
}).prefs({ abortEarly: false });
const result = schema.validate(
{ username: 'ab', age: 15, email: 'invalid' }
);
В этом режиме формируется полный список ошибок:
username слишком короткийage меньше допустимого значенияemail не соответствует форматуВсе нарушения возвращаются одновременно, что позволяет получить полную картину несоответствий данных.
При множественных ошибках результат содержит массив деталей:
{
error: {
details: [
{ message: '"username" length must be at least 3 characters long' },
{ message: '"age" must be greater than or equal to 18' },
{ message: '"email" must be a valid email' }
]
}
}
Каждый элемент массива соответствует отдельному нарушению правил схемы.
При использовании вложенных объектов поведение
abortEarly распространяется на каждый уровень структуры.
Например:
const schema = Joi.object({
user: Joi.object({
name: Joi.string().min(3),
profile: Joi.object({
age: Joi.number().min(18),
email: Joi.string().email()
})
})
});
При abortEarly: true прекращение происходит на первом
найденном несоответствии даже внутри вложенных объектов. При
false собираются ошибки на всех уровнях вложенности,
включая глубоко вложенные свойства.
Опция может задаваться не только в момент вызова
validate, но и через конфигурацию схемы:
const schema = Joi.object({
username: Joi.string().required()
}).prefs({
abortEarly: false
});
Такой подход фиксирует стратегию валидации для конкретной схемы независимо от места её использования.
abortEarly часто используется совместно с другими
параметрами:
stripUnknown — удаление лишних полейconvert — автоматическое приведение типовpresence — глобальные правила обязательности полейВ таких комбинациях порядок выполнения операций остаётся неизменным: сначала выполняется преобразование, затем проверка, после чего применяется стратегия остановки или накопления ошибок.
При активированном abortEarly: false увеличивается объём
диагностической информации. Это особенно важно в системах, где требуется
формирование полного отчёта о состоянии входных данных. Однако при этом
возрастает стоимость выполнения валидации, так как обход всей структуры
становится обязательным.
При abortEarly: true диагностика ограничена одной
ошибкой, что упрощает вывод, но снижает информативность результата.
Поведение валидации можно свести к двум моделям:
Обе стратегии являются частью одного механизма и выбираются в зависимости от требований к обработке данных и характеру входных структур