Освоение проверки пользовательских классов в Nest.js: подробное руководство

При создании надежных серверных приложений с помощью Nest.js проверка входящих данных является решающим аспектом. Хотя Nest.js предоставляет встроенные механизмы проверки с использованием декораторов и валидаторов классов, бывают случаи, когда вам необходимо реализовать собственные валидаторы классов для удовлетворения конкретных требований. В этой статье блога мы рассмотрим различные методы реализации пользовательских валидаторов классов в Nest.js, дополненные разговорными объяснениями и примерами кода.

Метод 1. Создание базового валидатора пользовательского класса

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

import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
@ValidatorConstraint({ name: 'custom', async: false })
export class UsernameLengthValidator implements ValidatorConstraintInterface {
  validate(username: string, args: ValidationArguments) {
    return username.length >= 5;
  }
  defaultMessage(args: ValidationArguments) {
    return 'Username must be at least 5 characters long';
  }
}

Объяснение: В приведенном выше коде мы создаем собственный валидатор класса, реализуя ValidatorConstraintInterface. Метод validateвыполняет логику проверки, а метод defaultMessageвыдает сообщение об ошибке в случае сбоя проверки. Мы используем декоратор @ValidatorConstraintдля регистрации валидатора.

Метод 2: использование внедрения зависимостей в пользовательских валидаторах

Nest.js использует внедрение зависимостей для эффективного управления зависимостями. Вы можете воспользоваться этой функцией в своих собственных валидаторах классов. Давайте рассмотрим пример, где нам нужно проверить адрес электронной почты, проверив его уникальность в базе данных:

import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface, Inject } from 'class-validator';
import { UserRepository } from '../repositories/user.repository';
@ValidatorConstraint({ name: 'uniqueEmail', async: true })
export class UniqueEmailValidator implements ValidatorConstraintInterface {
  constructor(@Inject(UserRepository) private userRepository: UserRepository) {}
  async validate(email: string, args: ValidationArguments) {
    const existingUser = await this.userRepository.findByEmail(email);
    return !existingUser;
  }
  defaultMessage(args: ValidationArguments) {
    return 'Email address is already in use';
  }
}

Объяснение: В этом примере мы вставляем UserRepositoryв конструктор пользовательского валидатора, что позволяет нам запросить базу данных и проверить, существует ли уже электронное письмо. Используя внедрение зависимостей, мы сохраняем модульность и удобство обслуживания нашего кода.

Метод 3: параметризованные валидаторы пользовательских классов

Пользовательские валидаторы также могут принимать параметры, что позволяет сделать их более гибкими и пригодными для повторного использования. Давайте рассмотрим сценарий, в котором мы хотим проверить, что строка имеет действительный шестнадцатеричный цветовой код:

import { ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
@ValidatorConstraint({ name: 'hexColor', async: false })
export class HexColorValidator implements ValidatorConstraintInterface {
  validate(color: string, args: ValidationArguments) {
    const regex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
    return regex.test(color);
  }
  defaultMessage(args: ValidationArguments) {
    return 'Invalid hexadecimal color code';
  }
}

Объяснение: HexColorValidatorпринимает строку цвета в качестве параметра и проверяет, соответствует ли она шаблону регулярного выражения для допустимого шестнадцатеричного кода цвета. Этот параметризованный подход позволяет повторно использовать валидатор для различных проверок цвета.

В этой статье блога мы рассмотрели различные методы реализации пользовательских валидаторов классов в Nest.js. Мы рассмотрели создание базовых валидаторов, использование внедрения зависимостей и параметризацию валидаторов для повторного использования. Используя эти методы, вы можете быть уверены, что ваши приложения Nest.js оснащены надежными и адаптированными механизмами проверки.