ValidationError в библиотеке class-validator представляет собой основной объект, через который система валидации возвращает информацию о найденных нарушениях правил. Каждый экземпляр описывает конкретную ошибку, привязанную к определённому свойству объекта, и может быть частью иерархического дерева при работе со вложенными структурами данных.
Каждый ValidationError содержит набор полей, отражающих контекст ошибки и её происхождение внутри проверяемого объекта.
Содержит исходный объект, который проходил валидацию.
objectОсобенность: Поле сохраняет полный объект, даже если ошибка относится только к одному свойству, что позволяет восстановить контекст валидации.
Определяет имя свойства, в котором обнаружено нарушение.
string"email", "password",
"profile.age"Поведение в иерархии: При вложенной валидации
значение может отражать путь к полю только на текущем уровне, тогда как
полная структура формируется через цепочку children.
Содержит фактическое значение, которое не прошло проверку.
anyПримеры значений:
"abc" при проверке числаundefined при обязательном полеОсновной источник человекочитаемых сообщений об ошибках.
{ [constraintName: string]: string }Каждое свойство объекта constraints представляет:
isEmail,
minLength)Пример структуры:
{
isEmail: "email must be an email",
minLength: "email is too short"
}
Особенность: Один ValidationError может содержать несколько нарушенных правил одновременно.
Массив вложенных ValidationError, возникающий при валидации сложных объектов.
ValidationError[]Если объект имеет структуру:
user: {
profile: {
age: "abc"
}
}
ошибка по age будет находиться в:
children → children → ValidationError
Ключевая характеристика: ValidationError формирует дерево, а не плоский список.
Дополнительные контексты ошибок, добавляемые некоторыми валидаторами.
{ [type: string]: ValidationErrorContext }Пример применения:
ValidationError формирует древовидную структуру, отражающую форму проверяемого объекта.
childrenValidationErrorUser (root ValidationError)
├── email (constraints)
├── password (constraints)
└── profile (children)
└── age (constraints)
При валидации плоской структуры children обычно
пуст:
{
property: "email",
constraints: { isEmail: "invalid email" },
children: []
}
При использовании ValidateNested формируется дерево:
При валидации массивов каждый элемент рассматривается как отдельный узел:
users[0] → ValidationError
users[1] → ValidationError
В children могут находиться ошибки конкретных
индексов.
На практике ValidationError часто преобразуется в линейный список для API-ответов.
Алгоритм обработки обычно включает:
constraintschildrenПример логики:
если constraints существует → добавить ошибки
если children существует → углубиться рекурсивно
Поле target сохраняет ссылку на исходный объект без
копирования.
Это приводит к нескольким важным последствиям:
Кастомные валидаторы могут формировать ValidationError с дополнительной информацией:
constraintscontextschildrenЭто позволяет интегрировать сложные бизнес-правила в стандартную модель ошибок.
ValidationError используется как промежуточный формат перед сериализацией:
constraintsЧасто сохраняется:
без полного target для уменьшения объёма логов.
Дерево children позволяет определить:
ValidationError не является чистым JSON-объектом:
targetСтандартная сериализация без фильтрации может приводить к ошибкам или чрезмерному объёму данных.