Метод validate является центральной частью механизма
проверки объектов в библиотеке class-validator. Он выполняет обход всех
декораторов валидации, применённых к свойствам объекта, и формирует
структурированный результат, содержащий ошибки, если они обнаружены.
В актуальной реализации метод имеет следующую форму:
validate(object: object, validatorOptions?: ValidatorOptions): Promise<ValidationError[]>
Возвращаемое значение всегда является Promise, который
разрешается в массив объектов ValidationError[]. Если
ошибок нет, возвращается пустой массив.
Первый параметр является обязательным и представляет собой экземпляр класса или обычный объект, содержащий поля с декораторами валидации.
Второй параметр — объект конфигурации, управляющий поведением процесса проверки.
Первый аргумент object — это сущность, к которой
применены правила валидации через декораторы. Именно его свойства
анализируются во время выполнения validate.
await validate(user);
Объект ValidatorOptions управляет логикой работы
валидации, влияя на то, какие данные считаются ошибочными и как
формируется результат.
skipMissingProperties?: boolean
Если установлено в true, отсутствующие свойства не
проверяются.
{
skipMissingProperties: true
}
Поведение:
undefined игнорируются;whitelist?: boolean
Удаляет все свойства, не имеющие валидаторов.
Поведение:
forbidNonWhitelisted?: boolean
Используется совместно с whitelist. Вместо удаления
лишних свойств выбрасывает ошибку.
Логика:
forbidUnknownValues?: boolean
Запрещает проверку объектов, которые не являются экземплярами классов с декораторами.
Поведение:
groups?: string[]
Позволяет выполнять выборочную валидацию по группам, заданным в декораторах.
Пример логики:
groups: ['create'] или
groups: ['update'];validate проверяет только совпадающие группы.always?: boolean
Если true, игнорирует группировку и выполняет все
валидаторы, помеченные как always.
validationError?: {
target?: boolean;
value?: boolean;
}
Управляет тем, какие данные попадут в объект ошибки:
target: включает исходный объект;value: включает значение проверяемого свойства.Используется для уменьшения объёма данных в ответах API.
Метод всегда возвращает Promise, даже если внутри нет асинхронных валидаторов.
const errors = await validate(user);
Внутренне процесс включает:
Каждая ошибка имеет следующую структуру:
{
property: string;
constraints?: Record<string, string>;
children?: ValidationError[];
target?: object;
value?: any;
}
Имя поля, где обнаружена ошибка.
Объект с описанием нарушенных правил:
{
isEmail: "email must be valid",
minLength: "too short"
}
Ошибки вложенных объектов.
Ссылка на исходный объект (если включено в options).
Фактическое значение поля.
Метод validate рекурсивно обходит вложенные классы при
использовании декораторов:
@ValidateNested()@Type(() => Class)Поведение:
children;При проверке массивов применяется поэлементная валидация:
@IsString({ each: true })
tags: string[];
Особенности:
each: true активирует проверку каждого
элемента;children.Хотя validate является основным методом, существует
синхронный аналог:
validate — всегда Promise;validateSync — немедленный результат без
async-валидаторов.При наличии асинхронных правил validateSync не
рекомендуется, так как игнорирует их.
Если объект не содержит ни одного валидируемого поля:
forbidUnknownValues = false возвращается пустой
массив;При использовании class-transformer:
validate;{
whitelist: true,
forbidNonWhitelisted: true,
forbidUnknownValues: true
}
{
skipMissingProperties: true
}
{
groups: ['create']
}
Результат validate обычно агрегируется:
Ошибки могут быть преобразованы в:
Основные факторы нагрузки:
Оптимизация достигается через:
skipMissingProperties;groups.