返回

使用class-validator和类验证器轻松实现表单验证!

前端

在NestJS中,表单验证是至关重要的,它能确保我们的后端服务接收到的数据是有效的和安全的。在本文中,我们将探讨如何使用class-validator 库和类验证器来实现表单验证。

前言

在上一篇文章中,我们使用拦截器和异常过滤器实现了请求返回的格式化,并在getOne 方法中添加了错误响应。这一节,我们将深入探讨表单验证,这对于确保我们的后端服务接收的数据是有效的和安全的至关重要。

什么是表单验证?

表单验证是一种确保从用户收集的数据符合特定规则和约束的过程。在NestJS中,我们可以使用class-validator 库来轻松实现表单验证。

安装class-validator

要安装class-validator ,请在终端中运行以下命令:

npm install class-validator --save

使用类验证器

类验证器允许我们定义数据模型并使用装饰器对属性进行验证。例如,我们可以创建以下数据模型:

import { IsNotEmpty, IsEmail } from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty()
  name: string;

  @IsNotEmpty()
  @IsEmail()
  email: string;
}

在此模型中,name 属性需要非空,而email 属性需要是一个有效的电子邮件地址。

在控制器中使用类验证器

现在我们已经定义了数据模型,可以在控制器中使用类验证器来验证传入的数据。例如:

import { Body, Controller, Post } from '@nestjs/common';
import { CreateUserDto } from './create-user.dto';

@Controller('users')
export class UsersController {
  @Post()
  async create(@Body() createUserDto: CreateUserDto) {
    // 对 createUserDto 进行验证
    const errors = validate(createUserDto);
    if (errors.length > 0) {
      throw new BadRequestException(errors);
    }

    // 处理创建用户逻辑
  }
}

自定义验证规则

除了内置的验证器之外,我们还可以创建自己的自定义验证规则。例如,我们可以创建一个IsUnique 验证器来检查电子邮件地址是否在数据库中唯一:

import { Injectable, ValidationArguments } from '@nestjs/common';
import { ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';

@Injectable()
@ValidatorConstraint({ name: 'isUnique', async: true })
export class IsUniqueValidator implements ValidatorConstraintInterface {
  async validate(value: string, args: ValidationArguments) {
    // 检查电子邮件地址是否在数据库中唯一
    const isUnique = await this.userService.isUniqueEmail(value);
    return isUnique;
  }
}

然后,我们可以使用自定义验证器来验证email 属性:

import { IsUnique } from './is-unique.validator';

export class CreateUserDto {
  @IsNotEmpty()
  name: string;

  @IsNotEmpty()
  @IsEmail()
  @IsUnique()
  email: string;
}

结论

使用class-validator 和类验证器,我们可以轻松地在NestJS应用程序中实现表单验证。这有助于确保我们接收到的数据是有效的和安全的,从而提升应用程序的健壮性和用户体验。