При создании надежных серверных приложений с помощью 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 оснащены надежными и адаптированными механизмами проверки.