首页 > 解决方案 > 当我需要验证数组的内容时,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;

    ...
}

CreateUserDtodata 已正确验证并生成InternalServerErrorResponse,但当CreateUserAddressDto我的数组中有某些项目时,未验证 data 。知道如何进行此验证吗?

标签: node.jstypescriptnestjs

解决方案


您要做的是-基本上将逻辑添加到使用嵌套提供的开箱即用的原始验证器中-也就是定义自定义验证器。

这可以通过使用两个类来完成,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;
}

就如此容易。


推荐阅读