我正在尝试验证Record,但它不起作用。
这是我的定制装潢师的样子
import {
isObject,
registerDecorator,
ValidationArguments,
ValidationOptions,
} from 'class-validator';
export const IsRecord = (
key_validators: ((value: string) => boolean)[],
value_validators: ((value: string[]) => boolean)[],
validationOptions?: ValidationOptions,
) => {
return function (object: unknown, propertyName: string) {
registerDecorator({
name: 'IsRecord',
target: (object as any).constructor,
propertyName: propertyName,
options: validationOptions,
validator: {
validate(value: unknown, args: ValidationArguments) {
if (!isObject(value)) return false;
const keys = Object.keys(value);
return keys.some(key => {
// eslint-disable-next-line @typescript-eslint/naming-convention
const is_key_invalid = key_validators.some(
validator => !validator(key),
);
if (is_key_invalid) return false;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return value_validators.some(validator => !validator(value[key]));
});
},
},
});
};
};我将在我的控制器中使用这个AutoRegisterDto来指定身体类型。
import {
BaseRole,
ModuleName,
Topic,
} from 'my-package';
import { IsBoolean, IsEnum, IsObject, IsOptional } from 'class-validator';
import { IsRecord } from './decorators/is-record.decorator';
export class AutoRegisterDto {
@IsEnum(ModuleName)
name: ModuleName;
@IsBoolean()
isEnabled: boolean;
@IsObject()
@IsOptional()
@IsRecord([], [])
actions: Record<Topic, BaseRole[]>;
}BaseRole Enum
export declare enum BaseRole {
UNREGISTERED_GUEST = "unregistered_user",
UNVERIFIED_GUEST = "unverified_guest",
VERIFIED_GUEST = "verified_guest",
STUDENT = "student",
EMPLOYEE = "employee",
ADMIN = "admin"
}和主题
export declare type Topic = string;我试着按照这个question的答案来解决这个问题,但是它对我不起作用。
(预先谢谢)
发布于 2022-10-03 04:45:32
最后我以这种方式解决了我的问题,我仔细阅读了类验证器的文档。
export const IsRecord = (validationOptions?: ValidationOptions) => {
return function (object: unknown, propertyName: string) {
registerDecorator({
name: 'IsRecord',
target: object.constructor,
propertyName: propertyName,
constraints: [],
options: {
message: 'Wrong object format',
...validationOptions,
},
validator: {
validate(value: unknown, args: ValidationArguments) {
if (!isObject(value)) return false;
if (Object.keys(value).length === 0) return true;
const keys = Object.keys(value);
return keys.every(key => {
if (typeof key != 'string') return false;
return Array.isArray(value[key]) && value[key].every(val => Object.values(BaseRole).includes(val));
});
},
},
});
};
};这将验证空对象或具有字符串类型的键和枚举BaseRole的值数组的对象。
https://stackoverflow.com/questions/73905403
复制相似问题