node.js - 当我需要验证数组的内容时,NestJS 中的 ValidationPipe 出现问题

标签 node.js typescript nestjs

我遇到的情况是我的客户端用户可以输入零个或多个地址。我的问题是,如果他输入地址,某些字段需要是必填的。

user.controller.ts

@Post()
@UsePipes(ValidationPipe)
async createUser(
    @Body() createUser: CreateUserDto,
) {
    return await this.service.saveUserAndAddress(createUser);
}

create-user.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 数据已正确验证并生成 InternalServerErrorResponse,但当我的数组中有某些项目时,CreateUserAddressDto 数据未经过验证。知道如何进行此验证吗?

最佳答案

Nest fw 使用 class-transformer 将 json 转换为类对象。如果子属性不是原始值,则必须为它设置正确的类型。你的属性是一个数组,你必须配置告诉class-validator它是一个数组,并验证每个项目。

让我们更新CreateUserDto

import { Type } from 'class-transformer';
import { ..., ValidateNested } from 'class-validator';

export class CreateUserAddressDto {
    ...


    @ValidateNested({ each: true })
    @Type(() => CreateUserAddressDto)
    addresses?: CreateUserAddressDto[];

    ...
}

关于node.js - 当我需要验证数组的内容时,NestJS 中的 ValidationPipe 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68989465/

相关文章:

sql - Sequelize 中的唯一值

angular - 嵌套的自定义 FormArray 组件不与具有 FormArrayName 的子表单绑定(bind)

visual-studio-2013 - typescript 1.0 map 文件不加载

javascript - Ionic/Angular HttpClient 未获取类型数据 : error Property 'name' does not exist on type '{}'

javascript - 如何模拟正在测试的服务调用的函数的实现?

node.js - express.js 中不同用户类型的不同 View /路线

css - 如何在 jade 布局中引用 css 文件

reactjs - WebSocket SocketIO 连接无法与 Heroku 上的 NestJS 服务器一起使用,并且无法在 Vercel 上响应客户端

mysql - 服务器 webRTC 连接的好方法

mongoose - 使用 Mongoose 崩溃在 NestJS 中实例化新文档