Класс-валидатор игнорирует вложенные объекты - PullRequest
1 голос
/ 19 февраля 2020

Я использую Nest Js Framework для своего проекта. В моем контроллере я принимаю запрос POST и через ValidationPipe я преобразую тело в мой CreateHouseDTO. ValidationPipe использует белый список и преобразование.

Когда я пытаюсь использовать API с JSON следующим образом:

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

Это то, что регистрирует мое приложение (вывод console.log):

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

Он даже проверяет вложенные объекты, когда я допускаю в них некоторые ошибки. Например, если я установлю имя свойство в Этаж объект на Нуль или на некоторое число без кавычек.

Is это баг или я что то не так делаю? Пожалуйста, помогите мне.

Мой код:


//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;
    }
}

1 Ответ

3 голосов
/ 19 февраля 2020

Вы должны сделать это так:

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

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