gpt4 book ai didi

node.js - NestJS/Class-transformer @Type Discriminator 对象无法正确验证数据

转载 作者:行者123 更新时间:2023-12-04 14:14:06 24 4
gpt4 key购买 nike

我有一个通用类如下:

import {IsArray, IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {PatientInfoValidator} from "./businessInfo/PatientInfoValidator";
import {TypeValidator} from "./TypeValidator";
import {Type} from "class-transformer";

export class GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;

@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;
}

以及从这个类继承的两个类
import {IsArray, IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {PatientInfoValidator} from "./businessInfo/PatientInfoValidator";
import {Type} from "class-transformer";
import {BusinessInfoValidator} from "./BusinessInfoValidator";
import {GenericValidator} from "./GenericValidator";
import {TypeValidator} from "./TypeValidator";

export class BodyValidator extends GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;

@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;

@ValidateNested({each:true})
@Type(() => BusinessInfoValidator)
businessInformation: BusinessInfoValidator;

@IsArray()
sheetLink: string[];

validate: boolean;
}


和:
import {GenericValidator} from "./GenericValidator";
import {IsNotEmpty, IsString, ValidateNested} from "class-validator";
import {Type} from "class-transformer";
import {TypeValidator} from "./TypeValidator";

export class CaseTwoValidator extends GenericValidator {
@IsString()
@IsNotEmpty()
userId: string;

@ValidateNested({each:true})
@Type(() => TypeValidator)
type: TypeValidator;

newKey: string;
}

这些在 DTO 中用于验证:
import { ApiProperty } from '@nestjs/swagger';
import {ValidateNested} from "class-validator";
import { Type } from 'class-transformer';
import { BodyValidator} from "../validators/BodyValidator";
import { GenericValidator} from "../validators/GenericValidator";
import { CaseTwoValidator} from "../validators/CaseTwoValidator";

export class CreateSheetsDto {
@ApiProperty()
@ValidateNested({ each: true })
@Type(() => GenericValidator, {
keepDiscriminatorProperty: true,
discriminator: {
property: "type.label",
subTypes: [
{ value: BodyValidator, name: "Hors dissection et syndrome neurologique" },
{ value: CaseTwoValidator, name: "NewCase" }
]
}
})
readonly body: BodyValidator | CaseTwoValidator;
}


我期待 Controller 将此 DTO 作为参数:
拒绝所有不符合 BodyValidator 或 CaseTwoValidator 格式的请求体作为错误请求。

当前行为:
API 请求非常宽松,不强制执行嵌套检查。

我想知道在这个问题上花了 3 个小时我是否遗漏了一些明显的东西。

最佳答案

不久前我遇到了完全相同的问题,并发现装饰器不适用于继承的类。装饰器,即 ( @IsString ) 必须直接应用于类,因此不幸的是,您必须将父类中的字段重新定义为子 DTO。
请参阅有关此 here 的 TypeScript 文档.具体这部分

A method decorator cannot be used in a declaration file, on an overload

关于node.js - NestJS/Class-transformer @Type Discriminator 对象无法正确验证数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62154082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com