Валидация в Ajv строится вокруг детализированного описания каждой ошибки, возникающей при проверке данных на соответствие JSON Schema. Каждая ошибка представляет собой объект с набором полей, позволяющих точно определить источник несоответствия и контекст его возникновения.
Ключевые поля объекта ошибки:
type, minLength, required)Пример типичной ошибки:
{
instancePath: "/age",
schemaPath: "#/properties/age/minimum",
keyword: "minimum",
message: "must be >= 18",
params: {
comparison: ">=",
limit: 18
}
}
Такая структура позволяет не только сообщить о факте ошибки, но и точно локализовать её в данных и в схеме.
По умолчанию Ajv может прерывать проверку при первой найденной ошибке, однако чаще используется режим накопления всех нарушений.
Ключевая опция:
При включённой опции валидатор продолжает обход схемы даже после
обнаружения несоответствий, формируя массив errors.
const validate = ajv.compile(schema);
validate(data);
console.log(validate.errors);
Каждый элемент массива соответствует отдельному нарушению.
При allErrors: false (значение по умолчанию в некоторых
конфигурациях) выполнение прерывается, как только обнаружено первое
несоответствие. Это уменьшает накладные расходы, но ограничивает
диагностическую информацию.
Такой режим используется в сценариях:
Поле keyword определяет тип проверки, которая не была
пройдена. Оно напрямую связано с логикой JSON Schema.
Часто встречающиеся значения:
Анализ keyword позволяет группировать ошибки по типам и
строить централизованную обработку.
instancePath описывает путь в проверяемом объекте в
формате JSON Pointer.
Примеры:
/user/name/items/0/price/address/cityЭтот путь используется для:
При глубокой вложенности объектов instancePath
становится основным инструментом локализации ошибки.
Поле schemaPath указывает на конкретное правило внутри
JSON Schema, которое было нарушено. Оно полезно при отладке сложных
схем, особенно при их генерации или композиции через allOf,
oneOf, anyOf.
Пример:
#/properties/user/properties/email/pattern
Это позволяет точно определить, какое ограничение сработало.
Поле message генерируется Ajv автоматически на основе
keyword и параметров ошибки.
Примеры:
Стандартные сообщения часто недостаточны для пользовательских интерфейсов, поэтому применяется их переопределение.
Поле params содержит контекст, необходимый для
интерпретации ошибки.
Примеры:
params: { limit: 10 }
params: { missingProperty: "email" }
params: { pattern: "^[0-9]+$" }
Это поле используется для генерации кастомных сообщений и бизнес-логики обработки.
Ajv поддерживает переопределение сообщений через несколько механизмов.
Плагин позволяет задавать собственные сообщения прямо в схеме:
const schema = {
type: "object",
properties: {
age: {
type: "number",
errorMessage: "Возраст должен быть числом"
}
}
};
Такой подход переносит ответственность за текст ошибки ближе к схеме.
После валидации ошибки могут быть преобразованы:
const errors = validate.errors.map(err => ({
field: err.instancePath,
rule: err.keyword,
message: err.message
}));
Это распространённый паттерн для API-слоёв.
В серверных приложениях ошибки Ajv часто приводятся к унифицированному формату:
{
field: "age",
code: "MINIMUM",
message: "Age must be at least 18"
}
Процесс нормализации включает:
schemaPath)instancePath в ключ поляkeyword в код ошибкиПри большом количестве нарушений полезно группировать ошибки по полям:
const grouped = validate.errors.reduce((acc, err) => {
const field = err.instancePath || "root";
acc[field] = acc[field] || [];
acc[field].push(err.message);
return acc;
}, {});
Результат удобен для отображения в формах.
Для массивов и объектов с глубокой вложенностью Ajv формирует сложные пути:
/users/3/email/orders/0/items/2/priceКорректная обработка таких путей требует парсинга
instancePath и сопоставления с UI-компонентами.
Ajv также генерирует ошибки не только данных, но и схемы:
Такие ошибки доступны через отдельные механизмы логирования и опции
strict.
Сбор ошибок влияет на производительность:
allErrors: false — минимальная нагрузкаallErrors: true — линейный рост затрат в зависимости от
числа нарушенийВ сложных схемах с oneOf и anyOf стоимость
может существенно возрастать из-за повторных проверок.
Валидация часто зависит от контекста:
if/then/else)dependentRequired)patternProperties)В таких случаях instancePath и schemaPath
дополняются контекстом ветвления схемы, что усложняет интерпретацию
ошибки.
В системах с распределённой архитектурой ошибки Ajv часто записываются в лог с дополнительными полями:
Это позволяет отслеживать деградацию данных и изменения контрактов API.
Ошибки Ajv используются в формах для:
Типичный маппинг:
instancePath → поле формыmessage → текст ошибкиkeyword → тип валидационного правилаТакая модель позволяет унифицировать клиентскую и серверную валидацию.
a-z↩︎