Декоратор @IsMobilePhone в библиотеке
class-validator используется для проверки строкового
значения на соответствие формату мобильного телефонного номера. Проверка
основана на правилах библиотеки validator.js, которая
предоставляет набор предопределённых региональных форматов и стандартов
валидации телефонных номеров.
Основное назначение — контроль корректности телефонных данных в DTO-моделях, особенно в серверных приложениях, где требуется строгая валидация входящих данных (например, в API на основе NestJS или Express с классами DTO).
Минимальная конфигурация предполагает только применение декоратора без дополнительных параметров:
import { IsMobilePhone } from 'class-validator';
export class CreateUserDto {
@IsMobilePhone()
phone: string;
}
В этом случае валидация будет использовать дефолтный набор локалей, что может привести к слишком широкому или недостаточно точному контролю формата.
Одним из ключевых параметров является указание локали (регионального формата). Это позволяет ограничить допустимые номера определённой страной или набором стран.
import { IsMobilePhone } from 'class-validator';
export class CreateUserDto {
@IsMobilePhone('ru-RU')
phone: string;
}
В данном примере допустимыми будут только номера, соответствующие российскому формату мобильных телефонов.
validator.js поддерживает множество локалей. Среди часто
используемых:
ru-RU — Россияen-US — СШАen-GB — Великобританияde-DE — Германияfr-FR — Францияany — широкий режим, допускающий различные
международные форматыПример использования универсальной проверки:
@IsMobilePhone('any')
phone: string;
Режим any снижает строгость проверки и подходит для
систем, где номера приходят из разных стран.
Второй параметр декоратора позволяет включить строгую проверку формата:
@IsMobilePhone('ru-RU', { strictMode: true })
phone: string;
Без strictMode библиотека допускает более гибкий разбор
строки.
ru-RU@IsMobilePhone('ru-RU')
phone: string;
Валидные значения:
+7999123456789991234567Невалидные значения:
12345+1 999 123 45 67phone123en-US@IsMobilePhone('en-US')
phone: string;
Валидные значения:
+120255501232025550123Невалидные значения:
+44 7700 900123+999999Декоратор @IsMobilePhone не рассматривает пустую строку
как валидное значение. Однако поведение зависит от комбинации с другими
декораторами:
import { IsOptional, IsMobilePhone } from 'class-validator';
export class UpdateUserDto {
@IsOptional()
@IsMobilePhone('ru-RU')
phone?: string;
}
В этом случае поле может отсутствовать, но если оно присутствует — обязано соответствовать формату.
Наиболее распространённый сценарий — валидация входных данных API.
import { IsMobilePhone, IsString } from 'class-validator';
export class RegisterDto {
@IsString()
name: string;
@IsMobilePhone('ru-RU')
phone: string;
}
Валидация выполняется до попадания данных в бизнес-логику, что снижает необходимость ручных проверок в сервисах.
При использовании ValidationPipe (например, в NestJS)
некорректные значения приводят к ошибке валидации:
{
"statusCode": 400,
"message": [
"phone must be a valid phone number"
],
"error": "Bad Request"
}
Сообщение может быть переопределено через параметр
message:
@IsMobilePhone('ru-RU', {}, { message: 'Некорректный номер телефона' })
phone: string;
@IsMobilePhone часто комбинируется с другими
валидаторами:
import { IsMobilePhone, Length } from 'class-validator';
export class UserDto {
@Length(10, 15)
@IsMobilePhone('any')
phone: string;
}
Однако такое сочетание может привести к конфликтам логики, если длина номера зависит от региона.
Проверка не реализуется вручную в class-validator, а
делегируется библиотеке validator.js. Это означает:
validator.jsСледующие случаи часто не проходят проверку:
strictModeext,
доб.)Хотя @IsMobilePhone не строго ограничен E.164, многие
валидные номера соответствуют этому стандарту:
+79991234567
E.164 предполагает:
+Использование strictMode приближает поведение к
E.164-подобной проверке, но не полностью заменяет её.
@IsMobilePhone()
phone: string;
Проблема: слишком широкая проверка, возможны неожиданные валидные форматы.
any без необходимости@IsMobilePhone('any')
phone: string;
Проблема: отсутствие контроля региональных стандартов.
Если номер предварительно изменяется (например, удаляются символы
+, пробелы), результат может перестать соответствовать
валидатору.
Валидация через @IsMobilePhone эффективнее всего
работает на уровне DTO:
Не рекомендуется использовать его внутри бизнес-логики, так как это нарушает разделение ответственности и дублирует слой проверки данных.
В системах с жёсткими контрактами (например, microservices или
GraphQL DTO) использование @IsMobilePhone снижает
вероятность попадания неконсистентных данных между сервисами. Особенно
это важно при хранении телефонов в унифицированном формате для: