Декоратор @IsIP относится к группе валидаторов библиотеки Class-validator и предназначен для проверки строкового значения на соответствие формату IP-адреса. Он поддерживает как IPv4, так и IPv6, а также позволяет ограничивать допустимый тип адреса через параметры конфигурации.
IP-адреса широко используются в сетевых приложениях, системах логирования, API-шлюзах, настройках доступа и телеметрии. Ошибки в формате IP могут приводить к:
@IsIP обеспечивает структурную валидацию строки до уровня синтаксиса, исключая некорректные значения до попадания в бизнес-логику.
В простейшем варианте декоратор применяется без параметров:
import { IsIP } from 'class-validator';
class NetworkConfig {
@IsIP()
address: string;
}
В этом случае допускаются IPv4 и IPv6 адреса.
IPv4 адрес состоит из четырёх октетов (0–255), разделённых точками.
Примеры валидных значений:
Пример использования:
import { IsIP } from 'class-validator';
class ServerDto {
@IsIP('4')
host: string;
}
Здесь параметр '4' ограничивает проверку только IPv4
адресами.
IPv6 представляет собой 128-битный адрес, записанный в шестнадцатеричном формате, разделённый двоеточиями.
Примеры:
Пример ограничения:
import { IsIP } from 'class-validator';
class ServerDto {
@IsIP('6')
host: string;
}
Декоратор принимает необязательный параметр типа:
type IPVersion = '4' | '6' | 'both';
Пример явного указания:
class ConnectionDto {
@IsIP('both')
clientIp: string;
}
Пустое значение не считается валидным IP:
''
Результат: ошибка валидации.
По умолчанию class-validator не валидирует
undefined и null, если не используются
дополнительные декораторы:
@IsOptional() — пропуск проверки при отсутствии
значенияПример:
import { IsIP, IsOptional } from 'class-validator';
class ProxyDto {
@IsOptional()
@IsIP('4')
proxyIp?: string;
}
import { IsNotEmpty, IsIP } from 'class-validator';
class NodeDto {
@IsNotEmpty()
@IsIP('4')
ip: string;
}
@IsNotEmpty() обеспечивает наличие значения, а
@IsIP() — корректность формата.
import { IsString, IsIP } from 'class-validator';
class HostDto {
@IsString()
@IsIP('both')
address: string;
}
Хотя IP-адрес всегда строка, явная проверка типа используется в строгих схемах DTO.
Class-validator учитывает специфику IPv4:
Примеры некорректных значений:
IPv6 проверка включает:
::;Примеры некорректных значений:
В экосистеме NestJS декоратор используется в DTO-классах для автоматической валидации входящих данных:
import { IsIP } from 'class-validator';
export class CreateServerDto {
@IsIP('4')
gateway: string;
}
При включённом ValidationPipe любые некорректные
значения приводят к выбросу ошибки BadRequestException.
Механизм проверки @IsIP включает несколько этапов:
Проверка IP-адресов имеет низкую вычислительную сложность:
В высоконагруженных системах валидатор может применяться без заметного влияния на latency.
Проверка IP клиента:
class RequestMetaDto {
@IsIP('both')
clientIp: string;
}
class DatabaseConfig {
@IsIP('4')
host: string;
}
class LogEntryDto {
@IsIP('both')
sourceIp: string;
}
Пример различий:
@IsIP может использоваться внутри пользовательских валидаторов:
import { ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
@ValidatorConstraint({ name: 'customIpCheck', async: false })
export class CustomIpCheck implements ValidatorConstraintInterface {
validate(value: string) {
return typeof value === 'string' && value.startsWith('192.') && value.length > 7;
}
}
Хотя подобные проверки не заменяют @IsIP, они могут дополнять его логикой бизнес-уровня.
При нарушении формата IP возвращается стандартная ошибка:
{
"constraints": {
"isIP": "address must be an ip address"
}
}
Сообщение может быть локализовано через механизмы i18n или
переопределено через ValidationOptions.
@IsIP('4', {
message: 'Некорректный IPv4 адрес'
})
ip: string;
Возможности: