Абортирование при первой ошибке

В библиотеке Joi механизм обработки ошибок валидации по умолчанию работает в режиме раннего прерывания. Это означает, что при обнаружении первой ошибки в структуре данных дальнейшая проверка остальных правил не выполняется. Такое поведение напрямую связано с опцией abortEarly, которая управляет стратегией сбора ошибок.

Параметр abortEarly и его значение

Ключевая настройка, влияющая на процесс валидации, задаётся через параметр:

  • abortEarly: true — режим по умолчанию
  • abortEarly: false — накопление всех ошибок

При значении true валидация прекращается сразу после первой найденной ошибки. При значении false анализ продолжается до конца схемы, и возвращается полный список всех нарушений.

Базовое поведение при abortEarly: true

Стандартная конфигурация приводит к следующему сценарию: при проверке объекта анализируются поля по очереди, и как только обнаруживается несоответствие схеме, процесс завершается.

Пример схемы:

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 выполнена не будет.

Причины использования раннего прерывания

Режим с остановкой на первой ошибке применяется в сценариях, где:

  • важна минимальная нагрузка на валидацию
  • требуется быстрое завершение проверки
  • дальнейшие ошибки не имеют смысла без исправления первой

Такой подход снижает объём вычислений, поскольку не требует анализа всей структуры данных после обнаружения критического несоответствия.

Полная валидация при abortEarly: false

Отключение раннего завершения меняет стратегию обработки:

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 диагностика ограничена одной ошибкой, что упрощает вывод, но снижает информативность результата.

Сравнение стратегий поведения

Поведение валидации можно свести к двум моделям:

  • раннее завершение: минимальное время выполнения, ограниченная информация
  • полное сканирование: больше вычислений, полный набор ошибок

Обе стратегии являются частью одного механизма и выбираются в зависимости от требований к обработке данных и характеру входных структур