Валидация схем JSON в Ajv может работать в нескольких режимах детализации ошибок, и один из ключевых механизмов получения расширенной информации — включение подробного (verbose) режима. Он влияет на структуру объектов ошибок и объём диагностических данных, которые возвращает валидатор при несоответствии данных схеме.
По умолчанию Ajv возвращает компактные объекты ошибок, содержащие минимально необходимую информацию:
instancePath — путь к данным, где произошла ошибкаschemaPath — путь в схемеkeyword — тип нарушения (например, type,
required)message — текстовое описание ошибкиparams — параметры конкретного keywordТакой формат оптимизирован для производительности и минимизации объёма данных, но часто недостаточен для глубокого анализа сложных схем.
При включении verbose-режима Ajv добавляет в объект ошибки дополнительные поля, которые позволяют более детально понять контекст нарушения:
data — фактическое значение, вызвавшее ошибкуschema — часть схемы, которая применялась в момент
проверкиparentSchema — родительский узел схемы, если он
существуетЭти данные особенно полезны при отладке сложных вложенных схем и динамически формируемых валидаторов.
Включение осуществляется через конфигурацию экземпляра Ajv:
import Ajv from "ajv";
const ajv = new Ajv({
allErrors: true,
verbose: true
});
Ключевое значение имеет именно параметр verbose: true,
который расширяет состав возвращаемых ошибок.
Рассмотрим схему и данные:
const schema = {
type: "object",
properties: {
age: { type: "number" }
},
required: ["age"]
};
const data = {
age: "not-a-number"
};
const validate = ajv.compile(schema);
validate(data);
console.log(validate.errors);
[
{
"instancePath": "/age",
"schemaPath": "#/properties/age/type",
"keyword": "type",
"params": {
"type": "number"
},
"message": "must be number"
}
]
[
{
"instancePath": "/age",
"schemaPath": "#/properties/age/type",
"keyword": "type",
"params": {
"type": "number"
},
"message": "must be number",
"data": "not-a-number",
"schema": "number",
"parentSchema": {
"type": "number"
}
}
]
Разница заключается в наличии контекстных полей, позволяющих увидеть не только факт ошибки, но и её точное происхождение.
Verbose-режим увеличивает объём памяти, используемый для формирования ошибок, поскольку в структуру включаются дополнительные ссылки на исходные данные и фрагменты схемы. Это может влиять на:
В высоконагруженных системах verbose часто отключают в production-среде, оставляя его для development-режима.
Параметр allErrors и verbose режим часто используются
совместно, но выполняют разные функции:
allErrors: true — собирает все ошибки, а не
останавливается на первойverbose: true — расширяет информацию внутри каждой
ошибкиКомбинация:
const ajv = new Ajv({
allErrors: true,
verbose: true
});
даёт максимально детализированный отчёт о валидации, что полезно при тестировании схем.
Verbose-режим особенно полезен при работе с:
anyOf, oneOf,
allOfДополнительные поля позволяют точно определить, на каком уровне вложенности произошёл сбой и какое именно значение его вызвало.
При использовании пользовательских keywords verbose-режим также может
расширять контекст ошибок, если разработчик возвращает структурированные
данные через errors внутри custom validator’а. В этом
случае важно соблюдать согласованность формата, чтобы не смешивать
стандартные и пользовательские поля.
Несмотря на полезность расширенного режима, существуют ограничения:
data, если оно содержит пользовательский вводВ системах, где важна безопасность или минимизация логов, verbose режим требует осторожного использования.
Поведение verbose-режима может незначительно отличаться между версиями Ajv:
Поэтому при миграции важно учитывать изменение набора доступных
полей, особенно если логика приложения опирается на schema
или parentSchema.
Verbose-ошибки часто интегрируются в системы мониторинга и логирования, где требуется:
Дополнительные поля позволяют строить более точные отчёты, связывая ошибку с конкретным участком схемы и входными данными.