#javascript #typescript #nestjs #dto #class-validator
#javascript #typescript #nestjs #dto #класс-валидатор
Вопрос:
У меня есть следующий объект DTO в моем контроллере NestJS как часть тела запроса:
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
Ответ №1:
Я предлагаю вам поработать с пользовательским валидатором, я пытался сделать что-то для вас:
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 amp;amp; typeof objValue === 'object' amp;amp; 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;
Комментарии:
1. Спасибо! С некоторыми незначительными изменениями он работал хорошо. К сожалению, это не допускает строгих типов, но это нормально.
Ответ №2:
Я бы посоветовал обратить внимание на пользовательский валидатор. Во время проверки он имеет доступ ко всем свойствам и значениям проверяемого объекта.
Все аргументы проверки вы можете передать в качестве второго параметра и использовать их внутри validator для управления потоком.
export class Post {
@Validate(CustomTextLength, {
keyType: String,
maxLength: 20
...
})
title: string;
}