NestJS 中用于键值对对象的 ValidationPipe
ValidationPipe in NestJS for a key-value pair object
我的 NestJS 控制器中有以下 DTO 对象作为请求正文的一部分:
export class UserPropertiesDto {
[key: string]: boolean;
}
例如:{campaignActive: true, metadataEnabled: false}
它是一个键值对 object
,其中键是唯一的 string
,它的值是 boolean
。
我想应用 class-validator
注释来确保正确的验证和转换,但它一直显示错误 Decorators are not valid here
:
export class UserPropertiesDto {
@IsOptional()
@IsString() // `key` should be a string
@MaxLength(20) // `key` should have no more than 20 characters
@IsBoolean() // `value` has to be a `boolean`
[key: string]: boolean;
}
能否请您提供有关最佳方法的建议:
- 确保保留所有对象的属性
- 验证密钥以确保它是一个长度不超过 20 个字符的字符串
- 验证值以确保它是
boolean
建议关注custom validator。在验证期间,它可以访问已验证对象的所有属性和值。
您可以作为第二个参数传递的所有验证参数,并在验证器内部使用它们来控制流程。
export class Post {
@Validate(CustomTextLength, {
keyType: String,
maxLength: 20
...
})
title: string;
}
我建议您使用自定义验证器,我尝试为您做一些工作:
iskeyvalue-validator.ts
import { ValidatorConstraint, ValidatorConstraintInterface,
ValidationArguments }
from
"class-validator";
import { Injectable } from '@nestjs/common';
@Injectable()
@ValidatorConstraint({ async: true })
export class IsKeyValueValidate implements ValidatorConstraintInterface {
async validate(colmunValue: Object, args: ValidationArguments) {
try {
if(this.isObject(colmunValue))
return false;
var isValidate = true;
Object.keys(colmunValue)
.forEach(function eachKey(key) {
if(key.length > 20 || typeof key != "string" || typeof colmunValue[key] !=
"boolean")
{
isValidate = false;
}
});
return isValidate ;
} catch (error) {
console.log(error);
}
}
isObject(objValue) {
return objValue && typeof objValue === 'object' && objValue.constructor === Object;
}
defaultMessage(args: ValidationArguments) { // here you can provide default error
message if validation failed
const params = args.constraints[0];
if (!params.message)
return `the ${args.property} is not validate`;
else
return params.message;
}
}
要实现它,您必须在模块提供程序中添加 IsKeyValueValidate :
providers: [...,IsKeyValueValidate],
在你的 Dto 中:
@IsOptional()
@Validate(IsKeyValueValidate,
[ { message:"Not valdiate!"}] )
test: Object;
我的 NestJS 控制器中有以下 DTO 对象作为请求正文的一部分:
export class UserPropertiesDto {
[key: string]: boolean;
}
例如:{campaignActive: true, metadataEnabled: false}
它是一个键值对 object
,其中键是唯一的 string
,它的值是 boolean
。
我想应用 class-validator
注释来确保正确的验证和转换,但它一直显示错误 Decorators are not valid here
:
export class UserPropertiesDto {
@IsOptional()
@IsString() // `key` should be a string
@MaxLength(20) // `key` should have no more than 20 characters
@IsBoolean() // `value` has to be a `boolean`
[key: string]: boolean;
}
能否请您提供有关最佳方法的建议:
- 确保保留所有对象的属性
- 验证密钥以确保它是一个长度不超过 20 个字符的字符串
- 验证值以确保它是
boolean
建议关注custom validator。在验证期间,它可以访问已验证对象的所有属性和值。
您可以作为第二个参数传递的所有验证参数,并在验证器内部使用它们来控制流程。
export class Post {
@Validate(CustomTextLength, {
keyType: String,
maxLength: 20
...
})
title: string;
}
我建议您使用自定义验证器,我尝试为您做一些工作:
iskeyvalue-validator.ts
import { ValidatorConstraint, ValidatorConstraintInterface,
ValidationArguments }
from
"class-validator";
import { Injectable } from '@nestjs/common';
@Injectable()
@ValidatorConstraint({ async: true })
export class IsKeyValueValidate implements ValidatorConstraintInterface {
async validate(colmunValue: Object, args: ValidationArguments) {
try {
if(this.isObject(colmunValue))
return false;
var isValidate = true;
Object.keys(colmunValue)
.forEach(function eachKey(key) {
if(key.length > 20 || typeof key != "string" || typeof colmunValue[key] !=
"boolean")
{
isValidate = false;
}
});
return isValidate ;
} catch (error) {
console.log(error);
}
}
isObject(objValue) {
return objValue && typeof objValue === 'object' && objValue.constructor === Object;
}
defaultMessage(args: ValidationArguments) { // here you can provide default error
message if validation failed
const params = args.constraints[0];
if (!params.message)
return `the ${args.property} is not validate`;
else
return params.message;
}
}
要实现它,您必须在模块提供程序中添加 IsKeyValueValidate :
providers: [...,IsKeyValueValidate],
在你的 Dto 中:
@IsOptional()
@Validate(IsKeyValueValidate,
[ { message:"Not valdiate!"}] )
test: Object;