Leo*_*uez 3 javascript node.js typescript class-validator nestjs
我正在尝试使用class-validator和NestJS验证嵌套对象。我已经尝试通过使用class-transform 的装饰器来跟踪此线程@Type,但没有任何运气。这是我所拥有的:
DTO:
class PositionDto {
@IsNumber()
cost: number;
@IsNumber()
quantity: number;
}
export class FreeAgentsCreateEventDto {
@IsNumber()
eventId: number;
@IsEnum(FinderGamesSkillLevel)
skillLevel: FinderGamesSkillLevel;
@ValidateNested({ each: true })
@Type(() => PositionDto)
positions: PositionDto[];
}
Run Code Online (Sandbox Code Playgroud)
我也在使用内置的nestjs验证管道,这是我的引导程序:
async function bootstrap() {
const app = await NestFactory.create(ServerModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(config.PORT);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)
对于其他属性,它工作正常,对象数组是唯一不起作用的数组。
tar*_*man 19
对我来说,我可以验证嵌套对象 'class-transformer'
import { Type } from 'class-transformer';
Run Code Online (Sandbox Code Playgroud)
完整示例:
import {
MinLength,
MaxLength,
IsNotEmpty,
ValidateNested,
IsDefined,
IsNotEmptyObject,
IsObject,
IsString,
} from 'class-validator';
import { Type } from 'class-transformer';
class MultiLanguageDTO {
@IsString()
@IsNotEmpty()
@MinLength(4)
@MaxLength(40)
en: string;
@IsString()
@IsNotEmpty()
@MinLength(4)
@MaxLength(40)
ar: string;
}
export class VideoDTO {
@IsDefined()
@IsNotEmptyObject()
@IsObject()
@ValidateNested()
@Type(() => MultiLanguageDTO)
name!: MultiLanguageDTO;
}
Run Code Online (Sandbox Code Playgroud)
您预计positions: [1]会抛出400,但是可以接受。
根据这个Github问题,这似乎是类验证器中的错误。如果你在一个基本类型(通过boolean,string,number,...)或array代替一个对象,它会接受输入的有效的,尽管它不应该。
除了创建自定义验证装饰器之外,我看不到任何标准的解决方法:
import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';
export function IsNonPrimitiveArray(validationOptions?: ValidationOptions) {
return (object: any, propertyName: string) => {
registerDecorator({
name: 'IsNonPrimitiveArray',
target: object.constructor,
propertyName,
constraints: [],
options: validationOptions,
validator: {
validate(value: any, args: ValidationArguments) {
return Array.isArray(value) && value.reduce((a, b) => a && typeof b === 'object' && !Array.isArray(b), true);
},
},
});
};
}
Run Code Online (Sandbox Code Playgroud)
然后在dto类中使用它:
@ValidateNested({ each: true })
@IsNonPrimitiveArray()
@Type(() => PositionDto)
positions: PositionDto[];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6047 次 |
| 最近记录: |