Метод string() в Joi определяет схему валидации
строковых значений. Любое входное значение приводится к строке (если
включено преобразование типов), после чего проходит последовательную
проверку заданных ограничений. Основная задача — гарантировать
соответствие данных ожидаемому строковому формату и набору правил.
При использовании Joi.string() создаётся базовая схема,
к которой добавляются уточняющие правила. Если входное значение не может
быть интерпретировано как строка (в зависимости от конфигурации строгого
режима), возникает ошибка валидации.
Базовая схема без дополнительных правил:
Joi.string()
Ожидает любое строковое значение. Допускаются пустые строки, если явно не указано обратное. При включённом приведении типов возможна конвертация чисел и других примитивов в строку.
Пример допустимых значений:
"hello""123"""Пример недопустимых значений (при строгой проверке):
nullundefined{}Для контроля размеров строки используются ограничения:
Joi.string().min(3).max(10)
min(n) — минимальная длина строкиmax(n) — максимальная длина строкиОграничения применяются после приведения значения к строке.
Пример:
"abc" — допустимо"ab" — ошибка (меньше минимального значения)"abcdefghijk" — ошибка (превышение максимума)Фиксированная длина строки:
Joi.string().length(5)
Эквивалент строгого диапазона, где min === max.
Позволяет задавать регулярное выражение:
Joi.string().pattern(/^[a-z]+$/)
Строка должна полностью соответствовать регулярному выражению.
Примеры:
"abc" — допустимо"abc123" — ошибкаТакже возможно использование именованных паттернов:
Joi.string().pattern(new RegExp('^[0-9]{3}$'))
Ограничение на латинские буквы и цифры:
Joi.string().alphanum()
Допустимые значения:
"abc123""A1B2C3"Недопустимые:
"abc-123""hello world"Проверка формата электронной почты:
Joi.string().email()
Включает базовую валидацию структуры:
@Возможны дополнительные настройки строгой проверки:
Joi.string().email({ tlds: { allow: false } })
Проверка URI:
Joi.string().uri()
Допустимые примеры:
"https://example.com""ftp://server.com/file"Можно ограничивать схемы:
Joi.string().uri({ scheme: ['http', 'https'] })
Проверка UUID:
Joi.string().uuid()
Поддерживаются версии UUID (v1–v5 в зависимости от конфигурации):
Joi.string().uuid({ version: 'uuidv4' })
Удаляет пробелы в начале и конце строки:
Joi.string().trim()
Пример:
" hello " → "hello"Преобразует строку в нижний регистр:
Joi.string().lowercase()
Преобразует строку в верхний регистр:
Joi.string().uppercase()
Нормализация Unicode:
Joi.string().normalize()
Используется для приведения строк к единому виду (например, при сравнении данных с разными формами Unicode).
Определяет список разрешённых значений:
Joi.string().valid('admin', 'user', 'guest')
Любое значение вне списка считается ошибкой.
Исключает значения:
Joi.string().invalid('root', 'superuser')
Добавляет исключения из правил валидации:
Joi.string().min(5).allow('')
Позволяет пустую строку, несмотря на ограничение минимальной длины.
По умолчанию пустая строка считается валидной. Поведение можно изменить:
Joi.string().empty('')
Пустые значения могут преобразовываться в undefined или
другое значение по правилам схемы.
Joi.string().required()
Поле обязательно должно присутствовать и быть строкой.
Joi.string().optional()
Явное указание необязательности (обычно используется по умолчанию).
Joi.string().default('unknown')
Если значение отсутствует, подставляется указанное значение.
Joi.string().min(5).messages({
'string.min': 'Строка слишком короткая'
})
Поддерживаются коды ошибок:
string.basestring.minstring.maxstring.lengthstring.pattern.basestring.emailstring.uriJoi применяет правила в определённом порядке:
trim, lowercase,
uppercase)email, uri,
pattern)valid,
invalid)Это важно при комбинировании нескольких методов.
Пример комплексной строки:
Joi.string()
.trim()
.lowercase()
.min(3)
.max(30)
.pattern(/^[a-z0-9_]+$/)
.required()
Такая схема описывает:
При включённом strict:
123 не считается строкой "123"Joi.string().strict()
При нарушении любого ограничения Joi возвращает объект ошибки, содержащий:
Это позволяет строить детализированную обработку ошибок на уровне приложения.