客观的
本文的主要目的是显示验证失败时如何生成自定义错误对象,但是我们将仔细研究使用类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 }
只是获得第一个错误并将其返回后停止的可选参数。我们可以随时自定义。
让我们假设我们有一个users
资源。我们需要在users
资源下的dto
文件夹中的Create create-user.dto.ts
文件,如下图所示。
在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"
}
如何生成自定义错误消息对象
,但是我们需要获得哪个属性以及错误消息以及错误消息。为此,我们需要使用一些配置在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"
}
如果您发现这有用,请确保在帖子上留下ð。谢谢!