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

NestJS 如何验证可选参数?

8 个月前提问
6 个月前修改
浏览次数49

1个答案

1

NestJS 在处理参数验证时,通常使用 class-validatorclass-transformer 这两个库。class-validator 允许我们通过装饰器在类上定义验证规则,而 class-transformer 可以将普通的对象转换成类的实例,使得 class-validator 能够应用这些规则。

对于可选参数的验证,我们可以使用 class-validator 提供的装饰器,并通过传递选项来指定参数为可选。下面是一个如何验证可选参数的例子:

首先,我们需要安装必要的包:

bash
npm install class-validator class-transformer

然后,定义一个 DTO(数据传输对象)并使用装饰器来指明哪些参数是可选的:

typescript
import { IsOptional, IsString, Length } from 'class-validator'; export class UpdateUserDto { @IsOptional() @IsString() @Length(2, 20) readonly name?: string; @IsOptional() @IsString() readonly bio?: string; }

在这个例子中,UpdateUserDto 类定义了两个可选属性:namebio@IsOptional() 装饰器表示属性是可选的,意即如果这个属性在传入对象中不存在或者为 nullundefined,则 class-validator 将不会应用后续的验证装饰器。

在你的控制器中,你可以使用 @Body 装饰器结合 ValidationPipe 来自动验证传入的请求体:

typescript
import { Body, Controller, Post, UsePipes, ValidationPipe } from '@nestjs/common'; @Controller('users') export class UsersController { @Post('update') @UsePipes(new ValidationPipe({ skipMissingProperties: true })) async update(@Body() updateUserDto: UpdateUserDto) { // 更新用户的逻辑 } }

ValidationPipeskipMissingProperties 选项设置为 true 时,仅会验证 DTO 中存在的属性,忽略未定义的属性。这样,即便是可选参数没有被传递,代码也不会因为验证失败而抛出错误。

这样,NestJS 就可以在保持强大验证能力的同时,灵活地处理可选参数。如果你需要对特定的属性即使它们不是必须的也要进行验证,只需要在那个属性上不使用 @IsOptional() 装饰器即可。

2024年6月29日 12:07 回复

你的答案