Проверка вложенных объектов с помощью class-validator в Nestjs

#nestjs #class-validator

#nestjs #class-validator

Вопрос:

У меня возникли трудности с проверкой вложенного объекта. Запуск NestJS с использованием class-validator. Поля верхнего уровня (first_name, last_name и т.д.) проверяются нормально. Объект Profile проверяется нормально на верхнем уровне, т.Е. Если я отправляю в виде массива, я получаю обратно правильную ошибку, что это должен быть объект.

Однако содержимое Profile не проверяется. Я следовал предложениям в документах, но, возможно, я просто что-то упускаю.

Кто-нибудь знает, как проверять поля вложенных объектов?

  export enum GenderType {
    Male,
    Female,
}

export class Profile {
    @IsEnum(GenderType) gender: string;
}

export class CreateClientDto {
    @Length(1) first_name: string;

    @Length(1) last_name: string;

    @IsEmail() email: string;

    @IsObject()
    @ValidateNested({each: true})
    @Type(() => Profile)
    profile: Profile; 
}
 

Когда я отправляю эту полезную нагрузку, я ожидаю, что она завершится неудачей, потому что пол отсутствует в перечислении или строке. Но это не сбой

 {
   "first_name":"A",
   "last_name":"B",
   "profile":{
      "gender":1
   }
}
 

Ответ №1:

Это поможет:

 export enum GenderType {
    Male = "male",
    Female = "female",
}

export class Profile {
    @IsEnum(GenderType) 
    gender: GenderType;
}

export class CreateClientDto {
    @IsObject()
    @ValidateNested()
    @Type(() => Profile)
    profile: Profile; 
}

 

P.S: Вам не нужно {each: true} , потому что это объект, а не массив

Комментарии:

1. это то, что у меня есть в моем коде. Я пробовал с {each:true} и без. Возможно, у меня проблема со средой.

2. Итак, позвольте мне спросить так, какой запрос отправляется? Какой ответ вы получаете? Какой ответ вы ожидаете увидеть? Я все еще не понимаю, в чем ваша проблема. Можете ли вы также опубликовать объект profile в своем коде?

3. Я добавил образец полезной нагрузки. не принимает ли class-validator перечисления?

Ответ №2:

https://www.typescriptlang.org/docs/handbook/enums.html#string-enums

В документах TS указано инициализировать перечисление строк.

Поэтому мне нужно было иметь:

 export enum GenderType {
    Male = 'Male',
    Female = 'Female',
}
 

Комментарии:

1. То, что вы сделали, правильно, gender: GenderType так и должно быть, а не string!

2. Упс! Теперь я знаю, почему это происходит! потому что перечисления заменяются на number! если только вы не определите для них строку! gender: 1 на самом деле это женщина! и gender: 0 является мужской причиной, потому что он определен как второй элемент в вашем классе enum! Я отредактировал свой ответ! проверьте это еще раз!