Базовые ограничения длины

Строковые значения в Joi ограничиваются через набор методов, задающих допустимую длину содержимого. Эти ограничения применяются до выполнения большинства других проверок и часто используются как базовый слой валидации входных данных.

Метод min(n) задаёт минимально допустимое количество символов в строке:

const schema = Joi.string().min(3);

Такое правило гарантирует, что строка не будет короче указанного значения. При нарушении условия возвращается ошибка валидации с указанием ожидаемой минимальной длины.

Особенность работы min заключается в том, что учитывается именно количество символов после базовой обработки входных данных. Если применяется trim(), пробелы по краям не участвуют в расчёте длины.

const schema = Joi.string().trim().min(3);

В этом случае строка " ab " после обрезки станет "ab" и не пройдёт проверку.


Ограничение максимальной длины строки

Метод max(n) задаёт верхнюю границу длины:

const schema = Joi.string().max(10);

Любая строка, превышающая указанное количество символов, считается невалидной.

Комбинация min и max позволяет формировать диапазон допустимых значений:

const schema = Joi.string().min(3).max(10);

Такая конструкция часто используется для описания логинов, идентификаторов и коротких текстовых полей.


Фиксированная длина строки

Метод length(n) задаёт строго фиксированную длину:

const schema = Joi.string().length(6);

В отличие от диапазона, допускается только одно значение длины. Это полезно для кодов подтверждения, коротких токенов и идентификаторов фиксированного формата.


Влияние преобразований на длину

Перед применением ограничений Joi может выполнять трансформации, которые изменяют итоговую длину строки.

Наиболее значимые из них:

  • trim() — удаляет пробелы по краям
  • normalize() — приводит строку к нормализованной форме Unicode
  • кастинг типов (например, число → строка)

Порядок имеет значение: сначала выполняются преобразования, затем проверка длины.

Joi.string().trim().min(5).max(10)

Если не учитывать трансформации, результат валидации может отличаться от ожидаемого.


Пустые строки и длина

Пустая строка "" имеет длину 0 и не проходит проверку min(1).

Joi.string().min(1)

Однако Joi позволяет явно разрешать пустые значения:

Joi.string().allow('')

В таком случае проверка длины для пустой строки фактически обходится, и min перестаёт быть применимым к этому конкретному значению.


Юникод и фактическая длина

Длина строки в Joi определяется количеством кодовых единиц JavaScript, а не визуальных символов. Это приводит к различиям при работе с эмодзи и сложными символами Unicode.

Пример:

  • "a" → длина 1
  • "?" → длина 2 (в UTF-16 представлении)

Это важно при использовании ограничений min, max, length, особенно в многоязычных приложениях.


Ограничения длины числовых значений

Для чисел прямого понятия “длина” не используется, но аналогичные ограничения реализуются через диапазоны значений:

Joi.number().min(10).max(100)

Здесь проверяется не количество цифр, а числовое значение.

Если требуется контроль количества цифр, число обычно преобразуется в строку:

Joi.string().length(6).pattern(/^\d+$/)

Ограничения длины массивов

Для массивов длина интерпретируется как количество элементов:

Joi.array().min(2).max(5)

Метод length(n) фиксирует точное количество элементов:

Joi.array().length(3)

Такие ограничения часто используются при валидации структурированных данных, например списков идентификаторов или фиксированных наборов параметров.


Комбинирование с другими правилами

Ограничения длины обычно комбинируются с дополнительными проверками:

Joi.string()
  .trim()
  .min(5)
  .max(20)
  .pattern(/^[a-zA-Z]+$/)

В такой конфигурации длина становится лишь одной из составляющих общей схемы валидации.

Порядок цепочки влияет на результат, поскольку трансформации выполняются до проверки условий.


Типовые ошибки при использовании ограничений длины

Распространённые проблемы при работе с длиной:

  • игнорирование trim(), из-за чего пробелы увеличивают длину
  • неправильный учёт Unicode-символов
  • одновременное использование allow('') и min(1), приводящее к конфликтной логике
  • ожидание проверки “количества символов” для числовых значений без преобразования типа

Поведение при ошибках валидации

При нарушении ограничений длины Joi возвращает структурированную ошибку, содержащую:

  • тип ошибки (string.min, string.max, string.length)
  • ожидаемое значение
  • фактическое значение

Это позволяет точно определять причину несоответствия без дополнительного анализа входных данных.