如何使用class-validator并在nest.js中生成自定义错误对象
#javascript #typescript #nest #classvalidator

客观的

本文的主要目的是显示验证失败时如何生成自定义错误对象,但是我们将仔细研究使用类validator的过程,然后再进行生成自定义错误对象的过程。

什么是班级录音机

类validator允许使用基于装饰的验证器和基于非指控器的验证。内部使用验证器.js执行验证。类validator在浏览器和node.js平台上工作。

如何使用它

为了在nest.js中使用类validator,我们需要安装类validator和class-transformer。
npm i --save class-validator class-transformer

要配置,在main.ts文件中,我们需要调用ValidationPipe()构造函数导入@nestjs/common并将其作为app.useGlobalPipes方法的参数。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe({ stopAtFirstError: true }));
  await app.listen(3500);
}

bootstrap();

{ stopAtFirstError: true }只是获得第一个错误并将其返回后停止的可选参数。我们可以随时自定义。

main.ts file

让我们假设我们有一个users资源。我们需要在users资源下的dto文件夹中的Create create-user.dto.ts文件,如下图所示。

create-user.to.ts file location

create-user.dto.ts文件中,添加了您需要添加的类验证。请参阅类访问者文档,以申请哪种验证。文档:https://www.npmjs.com/package/class-validator

这是我的create-user.dto.ts文件

import {
  IsNotEmpty,
  IsString,
  MinLength,
  IsAlpha,
  Matches,
  IsEnum,
} from 'class-validator';

export enum UserState {
  ACTIVE = 'Active',
  IN_ACTIVE = 'Inactive',
}

export class CreateUserDto {
  @IsNotEmpty()
  @IsString()
  @IsAlpha()
  @MinLength(1)
  readonly firstName: string;

  @IsNotEmpty()
  @IsString()
  readonly lastName: string;

  @IsNotEmpty()
  @IsString()
  @IsNotEmpty()
  @Matches(/^[\w-\.]+@([\w-]+\.)+[\w-]{2,3}$/g)
  readonly email: string;

  @IsNotEmpty()
  @IsString()
  @Matches(/^[6789]\d{9}$/)
  readonly phoneNumber: string;

  @IsNotEmpty()
  @IsString()
  @MinLength(3)
  readonly companyName: string;

  @IsEnum(UserState)
  readonly userState: UserState;
}

下一个导入CreateUserDto类并在用户控制器中使用它。

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

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  create(@Body() user: CreateUserDto) {
    return this.usersService.create(user);
  }
}

在Postman或任何其他API测试应用程序中发送请求后,这将自动验证并发送错误消息,如下所示
请求身体

{
  "firstName":"",
  "lastName":"K Joy",
  "email":"Nn@gail.com",
  "phoneNumber":"9160000000",
  "companyName":"abcgf",
  "userState":"Active"
}

响应

{
  "statusCode": 400,
  "message": [
    "firstName must be longer than or equal to 1 characters"
  ],
  "error": "Bad Request"
}

image of a non customized class-validator

如何生成自定义错误消息对象

,但是我们需要获得哪个属性以及错误消息以及错误消息。为此,我们需要使用一些配置在main.ts文件中配置ValidationPipe()

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe, BadRequestException } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      exceptionFactory: (errors) => {
        const result = errors.map((error) => ({
          property: error.property,
          message: error.constraints[Object.keys(error.constraints)[0]],
        }));
        return new BadRequestException(result);
      },
      stopAtFirstError: true,
    }),
  );
  await app.listen(3500);
}

bootstrap();

让我分解上述代码。下面的对象是错误对象。

{
  property: 'firstName',
  children: [],
  constraints: {
    minLength: 'firstName must be longer than or equal to 1 characters'
  }
}

property: error.property用法直接。
message基本上是约束对象内部的值。但是约束对象的关键(这里minLength)不是静态的。对于不同的验证失败,密钥将有所不同。

Object.keys(error.constraints)[0] object.keys只是将所有对象键更改为数组,我们访问[0]的第一个密钥。

请求身体

{
  "firstName":"",
  "lastName":"K Joy",
  "email":"Nn@gail.com",
  "phoneNumber":"9160000000",
  "companyName":"abcgf",
  "userState":"Active"
}

响应

{
  "statusCode": 400,
  "message": [
    {
      "property": "firstName",
      "message": "firstName must be longer than or equal to 1 characters"
    }
  ],
  "error": "Bad Request"
}

如果您发现这有用,请确保在帖子上留下ð。谢谢!