NestJS 在处理参数验证时,通常使用 class-validator
和 class-transformer
这两个库。class-validator
允许我们通过装饰器在类上定义验证规则,而 class-transformer
可以将普通的对象转换成类的实例,使得 class-validator
能够应用这些规则。
对于可选参数的验证,我们可以使用 class-validator
提供的装饰器,并通过传递选项来指定参数为可选。下面是一个如何验证可选参数的例子:
首先,我们需要安装必要的包:
bashnpm install class-validator class-transformer
然后,定义一个 DTO(数据传输对象)并使用装饰器来指明哪些参数是可选的:
typescriptimport { IsOptional, IsString, Length } from 'class-validator'; export class UpdateUserDto { @IsOptional() @IsString() @Length(2, 20) readonly name?: string; @IsOptional() @IsString() readonly bio?: string; }
在这个例子中,UpdateUserDto
类定义了两个可选属性:name
和 bio
。@IsOptional()
装饰器表示属性是可选的,意即如果这个属性在传入对象中不存在或者为 null
或 undefined
,则 class-validator
将不会应用后续的验证装饰器。
在你的控制器中,你可以使用 @Body
装饰器结合 ValidationPipe
来自动验证传入的请求体:
typescriptimport { 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) { // 更新用户的逻辑 } }
ValidationPipe
的 skipMissingProperties
选项设置为 true
时,仅会验证 DTO 中存在的属性,忽略未定义的属性。这样,即便是可选参数没有被传递,代码也不会因为验证失败而抛出错误。
这样,NestJS 就可以在保持强大验证能力的同时,灵活地处理可选参数。如果你需要对特定的属性即使它们不是必须的也要进行验证,只需要在那个属性上不使用 @IsOptional()
装饰器即可。
2024年6月29日 12:07 回复