Валидация длины строк — одна из базовых задач при обработке
пользовательского ввода. В библиотеке Class-validator для этого
предусмотрены декораторы @Length, @MinLength и
@MaxLength, позволяющие декларативно задавать ограничения
прямо в моделях данных.
Декоратор @Length используется для задания одновременно
минимальной и максимальной длины строки. Он применяется к свойствам
класса и проверяет, что длина значения находится в заданных пределах
включительно.
@Length(min: number, max: number, validationOptions?: ValidationOptions)
min — минимально допустимая длина строкиmax — максимально допустимая длина строкиvalidationOptions — дополнительные параметры валидации
(сообщения, группы и т.д.)import { Length } from "class-validator";
class CreateUserDto {
@Length(3, 20)
username: string;
}
В данном примере:
username должна содержать не менее 3
символовimport { Length } from "class-validator";
class CreateUserDto {
@Length(3, 20, {
message: "Имя пользователя должно быть от 3 до 20 символов",
})
username: string;
}
"") не проходит валидациюnull и undefined игнорируются, если не
используются дополнительные декораторы вроде
@IsNotEmptyДекоратор @MinLength применяется, когда необходимо
задать только нижнюю границу длины строки без ограничения сверху.
@MinLength(min: number, validationOptions?: ValidationOptions)
min — минимальное количество символовimport { MinLength } from "class-validator";
class ChangePasswordDto {
@MinLength(8)
password: string;
}
Здесь пароль должен содержать не менее 8 символов.
@MinLength часто используется вместе с
@IsNotEmpty, чтобы исключить пустые значения:
import { MinLength, IsNotEmpty } from "class-validator";
class ChangePasswordDto {
@IsNotEmpty()
@MinLength(8)
password: string;
}
import { MinLength } from "class-validator";
class ChangePasswordDto {
@MinLength(8, {
message: "Пароль должен содержать минимум 8 символов",
})
password: string;
}
Декоратор @MaxLength задаёт верхнюю границу длины
строки. Он используется, когда необходимо ограничить размер входных
данных, например, для полей базы данных или UI-ограничений.
@MaxLength(max: number, validationOptions?: ValidationOptions)
max — максимальное допустимое количество символовimport { MaxLength } from "class-validator";
class CreateCommentDto {
@MaxLength(200)
text: string;
}
Поле text не может превышать 200 символов.
import { MaxLength } from "class-validator";
class CreateCommentDto {
@MaxLength(200, {
message: "Комментарий не должен превышать 200 символов",
})
text: string;
}
Class-validator применяет проверки длины только к строкам. Если значение не является строкой, результат зависит от наличия других декораторов и настроек трансформации.
12345 (number) — может быть преобразовано или отклонено
в зависимости от class-transformernull — игнорируется, если не добавлен
@IsNotEmptyundefined — игнорируется"" — считается строкой длины 0 и проверяетсяКогда требуется ограничить строку только сверху или снизу, используется комбинация двух декораторов.
import { MinLength, MaxLength } from "class-validator";
class UpdateTitleDto {
@MinLength(5)
@MaxLength(100)
title: string;
}
Такой подход функционально эквивалентен @Length(5, 100),
но может быть удобнее при динамическом построении правил.
При использовании @IsOptional проверки длины не
выполняются, если значение отсутствует.
import { IsOptional, MinLength, MaxLength } from "class-validator";
class UpdateProfileDto {
@IsOptional()
@MinLength(2)
@MaxLength(30)
nickname?: string;
}
Поведение:
nickname не передан — валидация пропускаетсяПри использовании class-transformer входные данные могут
изменяться до валидации.
import { Transform } from "class-transformer";
import { Length } from "class-validator";
class UserDto {
@Transform(({ value }) => value?.trim())
@Length(3, 20)
username: string;
}
Здесь:
@MinLength(3)
username: string;
Строка " " проходит как длина 3, хотя фактически
содержит только пробелы.
Решение — комбинировать с трансформацией или дополнительной проверкой:
@Transform(({ value }) => value?.trim())
@MinLength(3)
username: string;
@MinLength(5)
password: string;
null не всегда считается ошибкой, если не добавлен
@IsNotEmpty.
Иногда ограничения длины дублируют ограничения базы данных. Например:
VARCHAR(255) в базе@MaxLength(255) в DTOНесоответствие приводит к ошибкам на уровне persistence слоя, если DTO не синхронизирован с схемой.
При нарушении ограничений длины возвращается объект ошибки валидации следующего вида:
{
"property": "username",
"constraints": {
"length": "username must be longer than or equal to 3 and shorter than or equal to 20 characters"
}
}
При кастомизации сообщения ключ length заменяется на
текст, заданный в message.
@Length(6, 6)
code: string;
Используется для:
@MaxLength(500)
description: string;
Применяется для:
@Length(8, 8)
serialNumber: string;
Используется для строго фиксированных форматов данных, когда длина является частью спецификации.