Class-验证器忽略嵌套对象

Class-validator is ignoring nested objects

我正在为我的项目使用 NestJs 框架。在我的控制器中,我接受 POST 请求并通过 ValidationPipe 将主体转换为我的 CreateHouseDTO。 ValidationPipe 正在使用白名单和转换。

当我像这样尝试 api 和 JSON 时:

{
    "name": "Test",
    "floors": [
        {
            "name": "floor1",
            "rooms": [
                {
                    "name": "room1"
                },
                {
                    "name": "room2"
                }
            ]
        }
    ]
}

这是我的应用记录的内容(console.log 输出):

CreateHouseDTO{
    name:'Test',
    floors[ {} ]
}

当我在其中犯了一些错误时,它甚至会验证嵌套对象。例如,如果我将 name 属性 in Floor 对象设置为 Null 或某些 数字 不带引号。

这是一个错误还是我做错了什么?请帮助我。

我的代码:


//My DTOs
import {ValidateNested, IsString, IsArray} from "class-validator";
import {Body, Controller, Post} from "@nestjs/common";

export class CreateHouseDTO {
    @IsNotEmpty()
    @IsString()
    public name?: string;

    @ValidateNested({each: true})
    @IsArray()
    @IsNotEmpty()
    public floors?: CreateFloorDTO[];
}

export class CreateFloorDTO {
    @IsString()
    @IsNotEmpty()
    public name?: string;

    @ValidateNested({each: true})
    @IsNotEmpty()
    @IsArray()
    public rooms?: CreateRoomDTO[];
}

export class CreateRoomDTO {
    @IsString()
    @IsNotEmpty()
    public name?: string;
}

//My Controller
@Controller("house")
export class HouseController {
    @Post()
    async create(
        @Body()
            body: CreateHouseDTO
    ) {
        console.log(body); //output I mentioned
        return body;
    }
}

你应该这样做:

export class CreateHouseDTO {
    @IsNotEmpty()
    @IsString()
    public name?: string;

    @ValidateNested({each: true})
    @IsArray()
    @IsNotEmpty()
    @Type(()=>CreateFloorDTO)
    public floors?: CreateFloorDTO[];
}