Декоратор @IsURL в библиотеке
class-validator используется для проверки строковых
значений на соответствие формату URL. В основе проверки лежит
функциональность библиотеки validator.js, поэтому поведение
декоратора напрямую зависит от набора правил и опций, поддерживаемых
валидатором URL.
Основное назначение декоратора — валидация данных DTO-моделей, особенно в приложениях, построенных на NestJS или любых архитектурах, где входные данные проходят через классы с аннотациями.
Проверка URL включает анализ следующих компонентов:
http, https,
ftp)Минимально допустимая строка может выглядеть как:
https://example.comhttp://localhost:3000ftp://192.168.0.1/resourceДекоратор применяется к свойству класса и не требует обязательных параметров:
import { IsURL } from 'class-validator';
export class CreateUserDto {
@IsURL()
website: string;
}
В этом случае используется стандартный набор правил
validator.js, где проверяются базовые требования к
корректности URL.
При отсутствии параметров:
http,
https, ftpexample.com
будет невалидным)Декоратор поддерживает объект конфигурации IsURLOptions,
который позволяет гибко управлять проверкой.
Определяет необходимость наличия протокола.
@IsURL({ require_protocol: true })
website: string;
Поведение:
https://example.com — валидноexample.com — невалидноТребует наличие доменной зоны верхнего уровня.
@IsURL({ require_tld: true })
website: string;
Поведение:
https://example.com — валидноhttps://localhost — невалидноРазрешает использование символа _ в доменной части.
@IsURL({ allow_underscores: true })
website: string;
Поведение:
http://my_site.com — валидно при включённой опцииhttp://my_site.com — невалидно по умолчаниюРазрешает завершающую точку в домене.
@IsURL({ allow_trailing_dot: true })
website: string;
Поведение:
https://example.com. — валидно при включённой
опцииhttps://example.com. — невалидно по умолчаниюРазрешает URL без указания протокола, начинающиеся с
//.
@IsURL({ allow_protocol_relative_urls: true })
website: string;
Поведение:
//example.com/path — валидноhttps://example.com/path — валидноexample.com/path — невалидноПозволяет ограничить список допустимых протоколов.
@IsURL({
protocols: ['https'],
})
website: string;
Поведение:
https://example.com — валидноhttp://example.com — невалидноТребует наличие хоста.
@IsURL({ require_host: true })
website: string;
Поведение:
https://example.com — валидноfile:///folder/file.txt — невалидноОпции могут использоваться совместно, формируя строгие правила валидации.
@IsURL({
require_protocol: true,
require_tld: true,
protocols: ['https'],
allow_underscores: false,
})
website: string;
В этом случае допустимыми будут только HTTPS-ссылки с полноценным доменом и без подчёркиваний.
При использовании в структурах данных декоратор интегрируется в цепочку валидации:
import { IsString, IsURL } from 'class-validator';
export class UpdateProfileDto {
@IsString()
username: string;
@IsURL({
require_protocol: true,
protocols: ['https', 'http'],
})
avatarUrl: string;
}
В процессе обработки запроса:
URL вроде:
http://localhost:3000http://127.0.0.1могут считаться валидными или невалидными в зависимости от опций:
require_tld: false — позволяет использовать
localhostrequire_tld: true — блокирует локальные адресаХотя проверка пересекается с валидацией доменов, @IsURL отличается тем, что:
@IsURL()
website: string;
Значение example.com будет отклонено, поскольку протокол
обязателен по умолчанию.
Комбинация:
@IsURL({
require_tld: true,
require_protocol: true,
protocols: ['https'],
})
может привести к отклонению локальных адресов и HTTP-ресурсов, что критично в средах разработки.
Строка:
/path/to/resourceне является URL и всегда будет считаться невалидной.
Все проверки основаны на validator.isURL, поэтому:
validator.js меняют поведениеВ DTO с большим количеством URL-полей часто комбинируются разные стратегии валидации:
export class LinkSetDto {
@IsURL({ require_protocol: true })
website: string;
@IsURL({ require_protocol: false, allow_protocol_relative_urls: true })
cdnUrl: string;
@IsURL({ protocols: ['https'] })
secureResource: string;
}
Такая структура позволяет разделять требования к внешним и внутренним ресурсам.
Декоратор @IsURL не проверяет обязательность поля. Для разрешения пустых значений обычно используется дополнительная аннотация:
@IsOptional()@IsOptional()
@IsURL()
website?: string;
Без @IsOptional() пустое значение будет проходить
валидацию как undefined, что может быть обработано отдельно
в логике DTO.
При использовании class-transformer важно учитывать: