Как проверить необязательные параметры в Nest.js? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь проверить параметры моих пользователей / конечных точек PUT, но мне бы хотелось, чтобы все параметры были необязательными, но как только потребитель API заполнит эти параметры, я бы хотел их проверить.

Я пытался объединить @ApiModelProperty, требующий false, с декоратором каналов проверки, но канал проверки принял ApiModelProperty (вполне нормально для отправки 400 неправильных запросов HttpException)

Вот мой DTO: usersUpdate.dto.ts

import { IsEmail, IsEnum, IsPhoneNumber, IsEmpty } from 'class-validator';
import { ApiModelProperty } from '@nestjs/swagger';
import { RoleType } from './role-type.enum';

class UserInfo {
    @ApiModelProperty({ description: 'User firstname', required: false  })
    readonly firstname: string;

    @ApiModelProperty({ description: 'User lastname', required: false  })
    readonly lastname: string;

    @ApiModelProperty({description: 'User postal address', required: false })
    readonly address: string;

    @ApiModelProperty({ description: 'User phone number', required: false  })
    @IsPhoneNumber('FR')
    readonly phone: string;

    @ApiModelProperty({ description: 'User siret number', required: false  })
    readonly siret: string;
}

export class UpdateUserDTO {
    @ApiModelProperty({ description: 'User email address', required: false })
    readonly email: string;

    @ApiModelProperty({ description: 'User password', required: false })
    readonly password: string;

    @ApiModelProperty({ description: 'User informations', required: false })
    readonly user_info: UserInfo;

    @ApiModelProperty({ enum: ['Admin', 'Runner', 'Dispatcher'], description:'User role',  required: false })
    readonly role: RoleType;

    @ApiModelProperty({ description: 'User activation token', required: false })
    readonly activationToken: string;
}

Я хотел бы использовать и @IsEmail() декоратор для параметра электронной почты и @Enum() декоратор в роли, но как только я использую этот декоратор, параметр обязателен.

Кто-нибудь знает, как пропустить этот валидатор, если параметры пусты?

1 Ответ

1 голос
/ 28 апреля 2019

Да, вы можете разрешить использование валидаторов в полях, применив декоратор @IsOptional из class-validator .

Еще одна вещь, которую вы можете использовать вместо @ApiModelProperty({ description: 'User activation token', required: false }), это@ApiModelPropertyOptional и, таким образом, удалите обязательный: false часть объявления.

Наконец, вы даже можете использовать декоратор @IsEmail() для проверки поля электронной почты:электронное письмо, и последнее, что вы можете сделать, это объединить @IsNotEmpty() и @IsOptional(), чтобы при заполнении поля оно не было пустым.

Предоставленный код будет выглядеть следующим образом:

    import { IsEmail, IsEnum, IsPhoneNumber, IsEmpty, IsOptional } from 'class-validator';
    import { ApiModelPropertyOptional } from '@nestjs/swagger';
    import { RoleType } from './role-type.enum';

    class UserInfo {
        @ApiModelPropertyOptional({ description: 'User firstname' })
        @IsOptional()
        readonly firstname: string;

        @ApiModelPropertyOptional({ description: 'User lastname' })
        @IsOptional()
        readonly lastname: string;

        @ApiModelPropertyOptional({description: 'User postal address' })
        @IsOptional()
        readonly address: string;

        @ApiModelPropertyOptional({ description: 'User phone number'  })
        @IsOptional()
        @IsPhoneNumber('FR')
        readonly phone: string;

        @ApiModelPropertyOptional({ description: 'User siret number'  })
        @IsOptional()
        readonly siret: string;
    }

    export class UpdateUserDTO {
        @ApiModelPropertyOptional({ description: 'User email address' })
        @IsEmail()
        @IsOptional()
        readonly email: string;

        @ApiModelPropertyOptional({ description: 'User password' })
        @IsOptional()
        readonly password: string;

        @ApiModelPropertyOptional({ description: 'User informations' })
        @IsOptional()
        readonly user_info: UserInfo;

        @ApiModelPropertyOptional({ enum: ['Admin', 'Runner', 'Dispatcher'], description:'User role' })
        @IsEnum(RoleType)
        @IsOptional()
        readonly role: RoleType;

        @ApiModelPropertyOptional({ description: 'User activation token' })
        @IsOptional()
        readonly activationToken: string;
    }

Дайте мне знать, если это поможет;)

...