乐闻世界logo
搜索文章和话题

Nestjs 如何使用类验证器实现嵌套对象验证?

1个答案

1

在 NestJS 中,可以通过使用 class-validator 包和 class-transformer 包来实现类验证。以下是如何使用这些工具来校验一个类的属性以及嵌套对象的步骤:

安装必需的包

首先,需要安装 class-validatorclass-transformer。可以使用 npm 或 yarn 来安装。

bash
npm install class-validator class-transformer # 或者 yarn add class-validator class-transformer

创建 DTO (Data Transfer Object) 类

在 NestJS 中,通常会创建 DTO (数据传输对象) 类,用于定义接收到的数据结构,并在类中应用验证规则。

typescript
import { IsString, IsInt, ValidateNested, IsEmail } from 'class-validator'; import { Type } from 'class-transformer'; class UserDto { @IsString() readonly name: string; @IsEmail() readonly email: string; @IsInt() readonly age: number; } class CreateUserDto { @ValidateNested({ each: true }) @Type(() => UserDto) readonly user: UserDto; }

在这个例子中,CreateUserDto 包含了一个嵌套的 UserDto 对象。使用 @ValidateNested() 装饰器来表明该属性是一个嵌套对象,并且需要被校验。@Type(() => UserDto)class-transformer 的装饰器,它告诉 NestJS 如何将原始数据转换为 UserDto 实例。

在控制器中使用 DTO

在控制器中,我们使用 DTO 类来接收和校验客户端发送的数据。

typescript
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 在这里已经通过验证,并且是一个 CreateUserDto 的实例 // 可以在这里实现创建用户的逻辑 } }

启用全局验证管道

为了使 class-validator 能够自动进行验证,需要设置 NestJS 全局验证管道。可以在应用的根模块或者 main.ts 中启用它。

typescript
import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, })); await app.listen(3000); } bootstrap();

在这个配置中,whitelist 设置为 true 会自动去除非白名单属性(即 DTO 中未定义的属性),而 forbidNonWhitelisted 设置为 true 会在接收到非白名单属性时抛出错误。transform 选项会自动将客户端的原始数据转换为 DTO 类的实例。

错误处理

如果输入数据不满足 DTO 类中定义的验证规则,NestJS 会抛出一个异常。通常,异常会被全局异常过滤器捕获,并返回一个包含错误信息的响应给客户端。如果需要定制错误信息,可以创建自定义的异常过滤器。

通过上述步骤,可以在 NestJS 应用程序中实现类验证,以及嵌套对象的校验。这种方法使得数据验证变得既简洁又强大,并且保证了在进入业务逻辑之前,输入数据的正确性和有效性。

2024年6月29日 12:07 回复

你的答案