Email, URI, hostname

Валидация email в Joi строится на базовом типе строки с применением метода email(). Основная задача проверки — соответствие формату RFC и контроль допустимых доменных структур.

const schema = Joi.object({
  email: Joi.string().email()
});

Метод email() поддерживает расширенные параметры, влияющие на строгость проверки:

  • multiple — разрешает список адресов через запятую
  • minDomainSegments — минимальное количество частей домена
  • tlds — контроль допустимых доменных зон
  • allowUnicode — разрешение Unicode-символов

Пример более строгой конфигурации:

const schema = Joi.object({
  email: Joi.string().email({
    minDomainSegments: 2,
    tlds: { allow: ['com', 'net', 'org'] }
  })
});

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


URI

Проверка URI выполняется через метод uri(), предназначенный для валидации URL-адресов и универсальных идентификаторов ресурсов. Основная задача — контроль схемы, структуры и допустимых символов.

const schema = Joi.object({
  website: Joi.string().uri()
});

Валидация охватывает такие элементы, как:

  • схема (http, https, ftp)
  • домен или IP-адрес
  • путь
  • query-параметры
  • фрагмент (#fragment)

Расширенные настройки позволяют ограничивать допустимые схемы:

const schema = Joi.object({
  website: Joi.string().uri({
    scheme: ['http', 'https']
  })
});

Дополнительно может применяться разрешение относительных путей:

const schema = Joi.object({
  path: Joi.string().uri({
    allowRelative: true
  })
});

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

При проверке URI Joi анализирует синтаксическую корректность, а не доступность ресурса. Это означает, что адрес может быть валидным по структуре, но не существовать в сети.


Hostname

Валидация hostname осуществляется через метод hostname(), который проверяет соответствие строки правилам именования хостов в сетевых системах.

const schema = Joi.object({
  host: Joi.string().hostname()
});

Hostname должен соответствовать следующим базовым требованиям:

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

Пример корректных значений:

  • example.com
  • api.service.local
  • sub-domain.example.org

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

const schema = Joi.object({
  host: Joi.string().hostname({
    tlds: { allow: ['com', 'net', 'org'] }
  })
});

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

Hostname-валидация часто применяется совместно с проверкой URI, когда требуется отделить доменную часть от полного адреса ресурса.