首页 > 解决方案 > 在nestjs中验证多层嵌套对象

问题描述

我试图在 nestJs 中使用 classValidator 装饰器来验证以下类型的传入请求

{
    address: string
    location: { 
        longitude: string, 
        latitude : string
    }
}

. 问题是它仅限于一层 nestedObject 。下面的一个有效

class ProjectLocation { 
    @IsString()
    address: string; 
}

export class CreateProjectDto {

    @ValidateNested({each:true})
    @Type(()=>ProjectLocation)
    location:ProjectLocation
}

但是当另一个嵌套层添加到 ProjectLocation 时,它不起作用,而且您也不能在 ProjectLocation 中使用 @ValidatedNested 向其中添加另一个类 Type 。

错误:没有重载匹配此调用。

标签: javascriptnode.jsnestjsclass-validator

解决方案


按预期工作,请考虑以下事项:

class SomeNestedObject {
    @IsString()
    someProp: string;
}

class ProjectLocation {
    @IsString()
    longitude: string;
    @IsString()
    latitude: string;
    @ValidateNested()
    @IsNotEmpty()
    @Type(() => SomeNestedObject)
    someNestedObject: SomeNestedObject;
}

export class CreateProjectDto {
    @IsString()
    address: string;
    @ValidateNested()
    @Type(() => ProjectLocation)
    location: ProjectLocation;
}

请注意,如果缺少道具,我将使用IsNotEmptyon来处理此案。someNestedObject


以下是正确验证的无效请求的两个示例:

示例 1:

Request-Body:    
    {
        "address": "abc",
        "location": { 
            "longitude": "123",
            "latitude" : "456",
            "someNestedObject": {}
        }
    }

Response:
{
    "statusCode": 400,
    "message": [
        "location.someNestedObject.someProp should not be empty"
    ],
    "error": "Bad Request"
}

示例 2:

Request-Body:
{
    "address": "abc",
    "location": { 
        "longitude": "123",
        "latitude" : "456"
    }
}
Response:
{
    "statusCode": 400,
    "message": [
        "location.someNestedObject should not be empty"
    ],
    "error": "Bad Request"
}

推荐阅读