Валидация доменных имён в Joi реализуется через цепочку правил для строкового типа. Базовый принцип заключается в том, что домен рассматривается как частный случай строки, подчиняющийся строгим синтаксическим ограничениям: допустимые символы, структура уровней, наличие точки-разделителя и корректность доменов верхнего уровня.
Основной метод:
Joi.string().domain()
При применении этого правила библиотека выполняет проверку соответствия строки формату доменного имени. Поддерживаются стандартные ASCII-домены, а также, при соответствующей конфигурации, интернационализированные домены (IDN).
Доменные имена состоят из нескольких уровней:
com,
org, ruexampleapi,
mailПример корректного значения:
api.example.com
Пример некорректного значения:
example..com
- example.com
example
Метод domain может принимать объект конфигурации,
расширяющий поведение проверки.
minDomainSegments
Определяет минимальное количество сегментов домена. Например:
Joi.string().domain({ minDomainSegments: 2 })
В этом случае строка example.com считается допустимой, а
example — нет.
tlds
Контролирует допустимость доменов верхнего уровня.
Joi.string().domain({
tlds: { allow: false }
})
При таком режиме любой TLD считается валидным без проверки списка.
Варианты настройки:
allow: true — разрешены только стандартные TLD из
внутреннего списка Joiallow: false — проверка TLD отключенаallow: ['com', 'net'] — разрешён ограниченный список
TLDПример ограничения:
Joi.string().domain({
tlds: { allow: ['com', 'org'] }
})
Значение example.net будет отклонено.
allowUnicode
Позволяет использовать интернационализированные домены:
Joi.string().domain({ allowUnicode: true })
Поддерживаются домены вида:
пример.рф
münchen.de
Без включения этого параметра такие значения считаются недопустимыми.
При нарушении структуры доменного имени Joi возвращает ошибку валидации с кодом, связанным с типом строки. Типичные причины:
Проверка кредитных карт в Joi выполняется через метод:
Joi.string().creditCard()
Этот валидатор предназначен для проверки строкового представления номера банковской карты. Основная задача — не подтверждение существования карты, а проверка её формата и математической корректности номера.
Номер карты обычно состоит из 13–19 цифр, иногда записывается с разделителями:
4111111111111111
4111 1111 1111 1111
Joi допускает наличие пробелов, но не допускает буквы, специальные символы или иные разделители.
Недопустимые варианты:
4111-1111-1111-1111
4111_1111_1111_1111
4111abcd1111
Проверка creditCard() основана на алгоритме Луна —
контрольной сумме, используемой для обнаружения ошибок ввода.
Принцип работы:
Пример:
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
После обработки алгоритмом Луна результат определяет корректность структуры номера.
Важно, что алгоритм не проверяет:
Он работает исключительно как механизм обнаружения опечаток и грубых ошибок.
Joi допускает форматирование номера карты пробелами, но внутренне выполняет нормализацию:
4111 1111 1111 1111 → 4111111111111111
После удаления пробелов выполняется проверка алгоритмом Луна.
Метод creditCard() часто используется совместно с
другими валидаторами строки:
Joi.string()
.trim()
.creditCard()
.required()
Здесь применяются дополнительные этапы обработки:
trim() удаляет пробелы по краям строкиcreditCard() проверяет структуру и контрольную
суммуrequired() запрещает пустое значениеПроверка домена часто комбинируется с ограничением длины и обязательностью значения:
Joi.string()
.domain({ tlds: { allow: true } })
.min(4)
.max(253)
.required()
Ограничение длины 253 символа соответствует стандарту DNS.
Дополнительно может использоваться нормализация регистра:
Joi.string()
.lowercase()
.domain()
Это позволяет унифицировать хранение доменных имён.
Для доменных имён:
_, пробелы,
спецсимволы)Для кредитных карт:
Joi позволяет переопределять текст ошибок для повышения информативности:
Joi.string()
.creditCard()
.messages({
'string.creditCard': 'Номер карты указан неверно'
})
Для доменных имён:
Joi.string()
.domain()
.messages({
'string.domain': 'Некорректный домен'
})
Коды ошибок остаются стабильными, что позволяет интегрировать валидацию в системы логирования и обработки исключений.
Домены и кредитные карты чаще всего применяются внутри объектов данных:
const schema = Joi.object({
website: Joi.string().domain(),
paymentCard: Joi.string().creditCard()
})
Такая структура позволяет одновременно проверять разные типы пользовательских данных в едином процессе валидации.
Валидация доменных имён и кредитных карт в Joi носит синтаксический характер. Это означает:
Результат проверки отражает только соответствие формальным правилам структуры строки и математическим ограничениям алгоритма Луна для номеров карт.