Строковые значения в 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(), из-за чего пробелы увеличивают
длинуallow('') и
min(1), приводящее к конфликтной логикеПри нарушении ограничений длины Joi возвращает структурированную ошибку, содержащую:
string.min, string.max,
string.length)Это позволяет точно определять причину несоответствия без дополнительного анализа входных данных.