В библиотеке Ajv ошибки делятся на несколько уровней, каждый из которых связан с различными этапами обработки схемы и данных. Основная категория — ошибки валидации, возникающие при проверке входных данных на соответствие JSON Schema. Они формируются после компиляции схемы и отражают несоответствия между данными и правилами схемы.
Каждая ошибка валидации в Ajv представляет собой объект с фиксированным набором полей:
Пример типичной ошибки:
{
"instancePath": "/age",
"schemaPath": "#/properties/age/type",
"keyword": "type",
"params": { "type": "number" },
"message": "must be number"
}
Ошибка type возникает при несоответствии значения
ожидаемому типу данных. Это одна из самых частых ошибок.
Примеры:
string, получен numberarray, получен object{
"keyword": "type",
"instancePath": "/name",
"params": { "type": "string" },
"message": "must be string"
}
Ключевое слово required вызывает ошибки при отсутствии
обязательных свойств в объекте.
{
"keyword": "required",
"instancePath": "",
"params": { "missingProperty": "email" },
"message": "must have required property 'email'"
}
Особенность таких ошибок — instancePath указывает на
объект, а не на конкретное поле.
При строгой схеме запрещены лишние поля.
{
"keyword": "additionalProperties",
"instancePath": "",
"params": { "additionalProperty": "unexpectedField" },
"message": "must NOT have additional properties"
}
Эти ошибки часто возникают при интеграции API, когда структура данных изменяется без обновления схемы.
Ключевое слово enum ограничивает набор допустимых
значений.
{
"keyword": "enum",
"instancePath": "/status",
"params": { "allowedValues": ["active", "disabled"] },
"message": "must be equal to one of the allowed values"
}
const требует точного совпадения значения.
{
"keyword": "const",
"instancePath": "/role",
"params": { "allowedValue": "admin" },
"message": "must be constant"
}
Проверка форматов (email, uri, date-time и др.) генерирует ошибки при несоответствии шаблону.
{
"keyword": "format",
"instancePath": "/email",
"params": { "format": "email" },
"message": "must match format \"email\""
}
Форматная валидация зависит от подключённых форматов Ajv и может расширяться плагинами.
Регулярные выражения в JSON Schema проверяются через
pattern.
{
"keyword": "pattern",
"instancePath": "/username",
"params": { "pattern": "^[a-zA-Z0-9_]+$" },
"message": "must match pattern \"^[a-zA-Z0-9_]+$\""
}
Для числовых значений применяются ограничения:
minimummaximumexclusiveMinimumexclusiveMaximummultipleOfПример:
{
"keyword": "minimum",
"instancePath": "/age",
"params": { "comparison": ">=", "limit": 18 },
"message": "must be >= 18"
}
Используются ключевые слова:
minLengthmaxLengthminItemsmaxItems{
"keyword": "minLength",
"instancePath": "/password",
"params": { "limit": 8 },
"message": "must NOT have fewer than 8 characters"
}
Схема может требовать наличие дополнительных полей при наличии определённого свойства.
{
"keyword": "dependencies",
"instancePath": "",
"params": { "property": "creditCard" },
"message": "must have property 'billingAddress'"
}
Ошибка возникает, если данные соответствуют более чем одной или ни одной схеме.
{
"keyword": "oneOf",
"instancePath": "",
"message": "must match exactly one schema in oneOf"
}
Ошибка возникает, если данные не соответствуют ни одной схеме.
{
"keyword": "anyOf",
"instancePath": "",
"message": "must match some schema in anyOf"
}
Ошибка возникает при несоответствии любой из вложенных схем.
{
"keyword": "allOf",
"instancePath": "",
"message": "must match all schemas in allOf"
}
Инвертированная проверка: данные не должны соответствовать схеме.
{
"keyword": "not",
"instancePath": "",
"message": "must NOT be valid"
}
При включённой опции coerceTypes Ajv пытается
преобразовывать значения. Ошибки возникают, когда приведение невозможно
или приводит к NaN.
Пример ситуации:
"abc" не может быть преобразована в числоAjv поддерживает расширение через пользовательские keywords. Ошибки
таких валидаторов формируются вручную и могут содержать произвольные
message и params.
ajv.addKeyword({
keyword: "isPositive",
validate: (schema, data) => data > 0,
error: { message: "must be positive number" }
});
Отдельный класс ошибок возникает до выполнения валидации:
Пример сообщения:
strict mode: unknown keyword "foo"
Такие ошибки выбрасываются через исключения, а не через массив
errors.
Ошибки конфигурации связаны с настройками экземпляра:
allErrors, strict,
removeAdditionalВ версии Ajv v8 используется поле instancePath вместо
устаревшего dataPath, что изменяет структуру
диагностики.
Ключевые различия:
instancePath — JSON Pointer к даннымschemaPath — путь к узлу схемыПри включённой опции allErrors возвращается массив всех
найденных ошибок вместо первой.
Это влияет на структуру диагностики:
В строгом режиме Ajv фиксирует дополнительные проблемы:
Такие ошибки могут блокировать компиляцию схемы.
Плагин errorMessage позволяет заменять стандартные
сообщения:
{
"keyword": "errorMessage",
"message": "Некорректный формат данных"
}
Это влияет только на message, не изменяя структуру
keyword, params и путей.
При сложной валидации одного объекта могут одновременно возникать несколько типов ошибок:
required)type)minimum)format)additionalProperties)Каждая ошибка фиксируется отдельно и сохраняет собственный
instancePath, что позволяет точно локализовать проблему в
структуре данных.