Nodejs Nestjs数据验证插件class-validator的使用

Nodejs Nestjs数据验证插件class-validator的使用
class-validator 是一个非常强大的库,用于在 Node.js 应用程序中进行对象属性的验证。它通常与 NestJS 框架一起使用来验证 DTO(数据传输对象)。下面是一个简单的示例,展示如何在 NestJS 中使用 class-validator

安装

首先,你需要安装 class-validatorclass-transformer

npm install class-validator class-transformer

创建 DTO 类

假设我们有一个用户注册的场景,我们需要验证用户的输入是否有效。

import { IsString, MinLength, MaxLength, IsEmail } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(4)
  @MaxLength(20)
  name: string;

  @IsEmail()
  email: string;

  @IsString()
  @MinLength(6)
  password: string;
}

使用 DTO 进行验证

在控制器中,你可以使用 class-validator 提供的 validate 方法来验证 DTO 对象。

import { Controller, Post, Body, HttpException, HttpStatus } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';

@Controller('users')
export class UsersController {
  @Post('register')
  async register(@Body() createUserDto: CreateUserDto) {
    const errors = await validate(createUserDto);

    if (errors.length > 0) {
      throw new HttpException({
        status: HttpStatus.BAD_REQUEST,
        error: 'Validation failed',
        details: errors,
      }, HttpStatus.BAD_REQUEST);
    }

    // 如果没有错误,则继续处理逻辑
    return { message: 'User registered successfully' };
  }
}

自定义验证规则

你也可以创建自定义验证规则。例如,我们可以添加一个规则来确保密码包含数字和字母。

import { registerDecorator, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
import { ValidationArguments } from 'class-validator';

@ValidatorConstraint({ async: false })
export class ContainsNumberAndLetterConstraint implements ValidatorConstraintInterface {
  validate(value: any, args: ValidationArguments) {
    return /[a-zA-Z]/.test(value) && /\d/.test(value);
  }

  defaultMessage(args: ValidationArguments) {
    return 'Password must contain at least one letter and one number';
  }
}

export function ContainsNumberAndLetter(validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      target: object.constructor,
      propertyName: propertyName,
      options: validationOptions,
      constraints: [],
      validator: ContainsNumberAndLetterConstraint,
    });
  };
}

然后在你的 DTO 类中应用这个自定义验证规则:

import { IsString, MinLength, MaxLength, IsEmail, ContainsNumberAndLetter } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(4)
  @MaxLength(20)
  name: string;

  @IsEmail()
  email: string;

  @IsString()
  @MinLength(6)
  @ContainsNumberAndLetter()
  password: string;
}

以上就是如何在 NestJS 中使用 class-validator 进行数据验证的基本方法。希望这对你有所帮助!


3 回复

当然,让我用点幽默来解释下class-validator在NestJS中的使用吧!

想象一下,你正在准备一场盛大的晚餐派对,而class-validator就是你的超级厨师助手。你的客人(也就是请求的数据)来了,你需要确保他们带来了正确的食物(即数据是正确的格式和类型)。

首先,你需要安装这个神奇的助手:

npm install class-validator class-transformer

然后,在你的菜谱(类)中,你可以添加一些特殊的调料(装饰器)来检查食物是否合格:

import { IsString, MinLength } from 'class-validator';

export class CreateDishDto {
  @IsString()
  @MinLength(3)
  name: string;

  @IsString()
  description: string;
}

最后,当客人带来他们的食物时,你可以让助手检查一切是否符合标准:

async create(@Body() createDishDto: CreateDishDto) {
  const errors = await validate(createDishDto);
  if (errors.length > 0) {
    throw new HttpException({ message: 'Invalid dish', errors }, HttpStatus.BAD_REQUEST);
  }
  // 现在你可以安全地烹饪了!
}

这样,你就确保了只有最好的食材才能进入你的厨房,你的派对一定会非常成功!


class-validator 是一个非常强大的库,用于在 TypeScript 或 JavaScript 应用程序中进行数据验证。结合 NestJS 使用时,它可以非常方便地对 DTO(数据传输对象)进行验证。下面我将演示如何安装、配置和使用 class-validator

1. 安装

首先,你需要在你的 NestJS 项目中安装 class-validatorclass-transformer(后者用于数据转换,例如从请求体到 DTO 对象):

npm install class-validator class-transformer

2. 创建 DTO 并添加验证规则

接下来,创建一个 DTO 类,并在其属性上应用验证规则。这里以一个用户注册 DTO 为例:

import { IsString, MinLength, MaxLength, IsEmail } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  @MinLength(4)
  @MaxLength(20)
  username: string;

  @IsString()
  @MinLength(8)
  password: string;
}

在这个例子中,我们定义了三个属性:emailusernamepassword,并为它们分别设置了验证规则。

3. 在控制器中使用 DTO

然后,在控制器中使用这个 DTO,并利用 NestJS 的自动验证功能来验证传入的数据:

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

@Controller('auth')
export class AuthController {
  @Post('register')
  register(@Body(new ValidationPipe()) createUserDto: CreateUserDto) {
    // 如果数据通过验证,createUserDto 将被正确填充
    console.log(createUserDto);
    
    // 这里可以继续处理用户注册逻辑
  }
}

4. 自定义错误消息

默认情况下,如果验证失败,NestJS 会返回通用的错误消息。你可以通过自定义验证管道来改变这一点:

import { Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
import { validate } from 'class-validator';
import { plainToClass } from 'class-transformer';

@Injectable()
export class CustomValidationPipe implements ArgumentMetadata {
  async transform(value: any, metadata: ArgumentMetadata) {
    const obj = plainToClass(metadata.metatype, value);
    const errors = await validate(obj);
    if (errors.length > 0) {
      throw new BadRequestException(errors);
    }
    return value;
  }
}

// 然后在控制器中使用这个自定义管道
@Post('register')
register(@Body(new CustomValidationPipe()) createUserDto: CreateUserDto) {
  // 处理逻辑
}

这样,当验证失败时,你可以获得详细的错误信息,从而更好地了解发生了什么问题。

这就是在 NestJS 中使用 class-validator 的基本流程。希望这对你有所帮助!

class-validator 是一个用于在 TypeScript/JavaScript 项目中进行对象属性验证的强大库,常与 NestJS 框架结合使用。首先安装 class-validatorclass-transformer

npm install class-validator class-transformer

定义验证规则时,你可以使用装饰器,例如:

import { IsString, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsString()
  @MinLength(4)
  readonly username: string;
}

在 NestJS 控制器中,你可以通过在方法参数前添加 @ValidationPipe() 来自动应用验证规则。这样,当客户端请求不符合 DTO 规定的数据格式时,NestJS 将返回一个错误响应。

回到顶部