node.js - 当我需要验证数组的内容时,NestJS 中的 ValidationPipe 出现问题
问题描述
我有一种情况,我的客户用户可以输入零个或多个地址。我的问题是,如果他输入地址,某些字段需要是强制性的。
用户控制器.ts
@Post()
@UsePipes(ValidationPipe)
async createUser(
@Body() createUser: CreateUserDto,
) {
return await this.service.saveUserAndAddress(createUser);
}
创建用户.dto.ts
export class CreateUserDto {
@IsNotEmpty({ message: 'ERROR_REQUIRED_FULL_NAME' })
fullName?: string;
@IsNotEmpty({ message: 'ERROR_REQUIRED_PASSWORD' })
password?: string;
@IsNotEmpty({ message: 'ERROR_REQUIRED_EMAIL' })
@IsEmail({}, { message: 'ERROR_INVALID_EMAIL' })
email?: string;
...
addresses?: CreateUserAddressDto[];
}
创建用户地址.dto.ts
export class CreateUserAddressDto {
...
@IsNotEmpty()
street: string;
...
}
CreateUserDto
data 已正确验证并生成InternalServerErrorResponse
,但当CreateUserAddressDto
我的数组中有某些项目时,未验证 data 。知道如何进行此验证吗?
解决方案
您要做的是-基本上将逻辑添加到使用嵌套提供的开箱即用的原始验证器中-也就是定义自定义验证器。
这可以通过使用两个类来完成,ValidatorConstraint
并由 ValidatorConstraintInterface
类验证器提供。
为了对此进行排序,将传入的输入/俱乐部任何您想要立即验证的数据转换为一个对象 - 使用nestjs中的管道或将其作为API调用本身的对象发送,然后在其顶部附加一个验证器.
要定义自定义验证器:
import { ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator';
/**
* declare your custom validator here
*/
@ValidatorConstraint({ name: 'MyValidator', async: false })
export class MyValidator implements ValidatorConstraintInterface {
/** return true when tests pass **/
validate(incomingObject: myIncomingDataInterface) {
try {
// your logic regarding what all is required in the object
const output = someLogic(incomingObject);
return output;
} catch (e) {
return false;
}
}
defaultMessage() {
return 'Address update needs ... xyz';
}
}
一旦你定义了这个,根据你的项目结构把它保存在某个地方。现在,您只需在要进行此验证时调用它。
在数据传输对象中,
// import the validator
import { Validate } from 'class-validator';
import { MyValidator } from './../some/safe/place'
export class SomeDto{
@ApiProperty({...})
@Validate(MyValidator)
thisBecomesIncomingObjectInFunction: string;
}
就如此容易。
推荐阅读
- c++11 - 获取 rtpL16 数据到本地文件 | 如何检查文件是否符合预期?
- dart - Angular Dart 给出错误:getter 'injector$Injector' 没有为类 'self' 定义
- amazon-web-services - 将 RDS 复制到新数据库的最快方法
- angular - 如何测试角度形式的第一个表单控制重点是使用茉莉花的页面加载
- java - 无法使用 Java 从 S3 下载文件
- java - @Test(expected = Exception.class) 或 Assertions.assertThrows(...) 或 assertThatThrownBy(..) 推荐哪一个?
- swift - 在主应用程序包和它包含的框架之间进行通信
- windows - GitHub 的凭据“卡在”我的另一个帐户上
- powershell - 将变量值推送到新的记事本窗口中(不保存文件)
- apache-nifi - 如何在 NiFi 中向管理员用户授予所有权限