Доменные имена и creditCard

Валидация доменных имён в Joi реализуется через цепочку правил для строкового типа. Базовый принцип заключается в том, что домен рассматривается как частный случай строки, подчиняющийся строгим синтаксическим ограничениям: допустимые символы, структура уровней, наличие точки-разделителя и корректность доменов верхнего уровня.

Основной метод:

Joi.string().domain()

При применении этого правила библиотека выполняет проверку соответствия строки формату доменного имени. Поддерживаются стандартные ASCII-домены, а также, при соответствующей конфигурации, интернационализированные домены (IDN).

Структура доменного имени

Доменные имена состоят из нескольких уровней:

  • домен верхнего уровня (TLD), например com, org, ru
  • основной домен второго уровня, например example
  • дополнительные поддомены, например api, mail

Пример корректного значения:

api.example.com

Пример некорректного значения:

example..com
- example.com
example

Параметры метода domain

Метод domain может принимать объект конфигурации, расширяющий поведение проверки.

minDomainSegments

Определяет минимальное количество сегментов домена. Например:

Joi.string().domain({ minDomainSegments: 2 })

В этом случае строка example.com считается допустимой, а example — нет.

tlds

Контролирует допустимость доменов верхнего уровня.

Joi.string().domain({
  tlds: { allow: false }
})

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

Варианты настройки:

  • allow: true — разрешены только стандартные TLD из внутреннего списка Joi
  • allow: 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 возвращает ошибку валидации с кодом, связанным с типом строки. Типичные причины:

  • отсутствие точки-разделителя
  • наличие недопустимых символов
  • неправильный TLD
  • пустые сегменты между точками

Валидация кредитных карт

Проверка кредитных карт в Joi выполняется через метод:

Joi.string().creditCard()

Этот валидатор предназначен для проверки строкового представления номера банковской карты. Основная задача — не подтверждение существования карты, а проверка её формата и математической корректности номера.

Формат кредитной карты

Номер карты обычно состоит из 13–19 цифр, иногда записывается с разделителями:

4111111111111111
4111 1111 1111 1111

Joi допускает наличие пробелов, но не допускает буквы, специальные символы или иные разделители.

Недопустимые варианты:

4111-1111-1111-1111
4111_1111_1111_1111
4111abcd1111

Алгоритм Луна (Luhn)

Проверка creditCard() основана на алгоритме Луна — контрольной сумме, используемой для обнаружения ошибок ввода.

Принцип работы:

  1. Цифры номера карты обрабатываются справа налево
  2. Каждая вторая цифра удваивается
  3. Если результат больше 9, из него вычитается 9
  4. Все цифры суммируются
  5. Валидным считается номер, сумма которого делится на 10 без остатка

Пример:

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()

Это позволяет унифицировать хранение доменных имён.


Ошибки и типовые причины отклонения значений

Для доменных имён:

  • отсутствие TLD при включённой проверке сегментов
  • использование запрещённых символов (_, пробелы, спецсимволы)
  • неправильная структура поддоменов
  • превышение длины сегментов

Для кредитных карт:

  • наличие букв или символов
  • нарушение алгоритма Луна
  • неправильная длина номера
  • недопустимые разделители

Поведение при кастомизации сообщений

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 носит синтаксический характер. Это означает:

  • отсутствие проверки существования домена в DNS
  • отсутствие связи с банковскими системами
  • отсутствие проверки актуальности или активности данных

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