在 NestJS 中,可以通过使用 class-validator
包和 class-transformer
包来实现类验证。以下是如何使用这些工具来校验一个类的属性以及嵌套对象的步骤:
安装必需的包
首先,需要安装 class-validator
和 class-transformer
。可以使用 npm 或 yarn 来安装。
bashnpm install class-validator class-transformer # 或者 yarn add class-validator class-transformer
创建 DTO (Data Transfer Object) 类
在 NestJS 中,通常会创建 DTO (数据传输对象) 类,用于定义接收到的数据结构,并在类中应用验证规则。
typescriptimport { 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 类来接收和校验客户端发送的数据。
typescriptimport { 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 中启用它。
typescriptimport { 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 应用程序中实现类验证,以及嵌套对象的校验。这种方法使得数据验证变得既简洁又强大,并且保证了在进入业务逻辑之前,输入数据的正确性和有效性。