Под verbose-режимом в контексте Joi обычно понимается максимальная детализация информации о процессе валидации: расширенные сообщения об ошибках, полное раскрытие структуры ошибок, контекста, путей данных, а также подробное описание самой схемы через механизмы introspection. В Joi отсутствует отдельный переключатель с названием «verbose», однако аналогичный эффект достигается через комбинацию API возможностей: конфигурацию валидации, работу с объектом ошибки, настройку сообщений и использование метода описания схемы.
При вызове schema.validate(value, options) или
schema.validateAsync(value, options) возвращается объект,
содержащий:
value — преобразованное и валидированное значениеerror — объект ошибки ValidationError,
если валидация не прошлаwarning — предупреждения (при соответствующих
настройках)Максимально подробное представление ошибок формируется внутри
error.details.
Каждый элемент массива details содержит:
message — итоговое сообщение ошибкиpath — путь к некорректному полю (массив ключей)type — тип нарушения правила (например,
string.min, number.base)context — контекст ошибки (ожидаемое значение, лимиты,
метаданные)original — исходное значение (в зависимости от версии и
настроек)state — внутреннее состояние парсинга (используется для
отладки цепочек)Именно структура details является основой
verbose-представления ошибок, позволяя анализировать не только факт
сбоя, но и его точное происхождение.
Одним из ключевых механизмов детализации является параметр:
abortEarly: falseПо умолчанию Joi прекращает проверку при первой ошибке. Это уменьшает объем информации. При отключении раннего прерывания формируется полный список всех нарушений.
Пример логики:
abortEarly: true — одна ошибкаabortEarly: false — полный массив всех найденных
несоответствийПри использовании verbose-подхода почти всегда включается накопление ошибок, поскольку оно раскрывает полную картину состояния данных.
Объект ValidationError в Joi содержит дополнительные
поля:
name — тип ошибки (ValidationError)message — агрегированное сообщениеdetails — массив детальных ошибокannotate() — метод генерации читаемого представления
схемы с пометками ошибокisJoi — маркер принадлежности к Joistack — стек вызовов (при включённой детализации
окружения)Метод annotate() особенно важен для verbose-анализа. Он
накладывает ошибки на текстовое описание схемы, позволяя видеть
проблемные узлы прямо в структуре.
Для анализа самой схемы, а не результата валидации, используется:
schema.describe()Этот метод возвращает структурированное описание схемы в виде объекта, содержащего:
type)rules)flags)keys, items)alternatives)Пример логики описания:
describe() используется как основной инструмент
introspection и фактически представляет verbose-режим схемы Joi.
Уровень информативности ошибок может существенно увеличиваться за счёт кастомных сообщений:
Joi.string().min(5).messages({
'string.min': 'Значение меньше минимальной длины',
'string.base': 'Ожидается строка'
})
Каждое правило Joi имеет идентификатор типа ошибки. Подмена сообщений позволяет:
В verbose-подходе кастомизация сообщений является стандартной практикой, поскольку дефолтные тексты Joi ориентированы на универсальность, а не на прикладной контекст.
Поле context в деталях ошибки играет ключевую роль в
диагностике. В зависимости от типа правила оно может содержать:
limit — ограничение (например, минимум длины)value — фактическое значениеkey — имя поляlabel — человекочитаемое имяpattern — регулярное выражениеpeers — связанные поля (для object rules)Эта информация позволяет точно реконструировать причину нарушения без необходимости дополнительной обработки входных данных.
Joi активно используется для валидации вложенных объектов и массивов.
В verbose-режиме особое значение имеет поле path,
представляющее маршрут до проблемного значения:
Примеры:
["user", "email"]["items", 3, "price"]["profile", "addresses", 0, "zip"]path позволяет:
При отключённом abortEarly формируется полный список
ошибок, однако Joi дополнительно группирует их в массив
details, не выполняя иерархическую агрегацию по
умолчанию.
Каждая ошибка независима, но содержит собственный path,
что позволяет восстанавливать структуру вручную при необходимости
построения сложных диагностических отчётов.
Опция:
convert: trueвлияет на предварительную нормализацию данных перед валидацией.
В verbose-контексте это важно, поскольку:
При convert: false увеличивается предсказуемость, но
уменьшается гибкость обработки входных данных.
При использовании alternatives() Joi формирует
ветвящиеся схемы. В verbose-режиме ошибки содержат информацию о:
Это особенно важно при:
Joi поддерживает тонкую настройку через prefs:
errors.wrap.labelerrors.languageerrors.escapeHtmlmessagesКонфигурация:
const schema = Joi.object({...}).prefs({
errors: {
label: 'key'
}
})
Эти параметры влияют на то, насколько «развёрнутым» будет итоговое сообщение.
При включённой отладочной конфигурации могут быть доступны:
stack traceХотя стек не является частью стандартного verbose-вывода, он используется при глубокой диагностике сложных схем и нестабильных данных.
Метод:
error.annotate()создаёт текстовое представление схемы с встраиванием ошибок прямо в структуру.
Принцип:
Это один из наиболее наглядных способов verbose-анализа, особенно при отладке сложных object-схем.
validateAsync возвращает промис, но структура ошибки
идентична синхронной версии. Verbose-детализация сохраняется полностью,
включая:
detailscontextpathАсинхронность влияет только на способ получения результата, но не на глубину информации.