Выполните несколько пользовательских проверок asyn c с помощью class-validator - PullRequest
0 голосов
/ 06 августа 2020

Я хотел бы иметь следующий dto:

export class SetEntryPasswordDto {
    @ApiProperty()
    @Validate(EntryBelongsToUser)
    @Validate(EntryIsNotLocked)
    @Type(() => Number)
    @IsNumber()
    id: number;

    @ApiProperty()
    @IsString()
    @IsNotEmpty()
    @Validate(PasswordMatchValidator)
    @Matches(EValidator.PASSWORD, { message: 'password is not strong enough' })
    password: string;

    @ApiProperty()
    @IsNotEmpty()
    @IsString()
    confirmPassword: string;

    @ApiProperty()
    @IsOptional()
    @IsString()
    passwordHint?: string;

    @IsNumber()
    userId: number;
}

Проблема в том, что мне нужно сделать пару проверок asyn c, и я хотел бы использовать класс-валидатор lib для этого.

Мой вопрос: если я сделаю это, как в приведенном выше фрагменте кода, могу ли я быть уверен, что первым завершится EntryIsNotLocked? Если нет, то как заставить эти проверки выполняться по порядку?

Спасибо.

Дополнительная информация:

Похоже, есть важная информация.

EntryBelongsToUser и EntryIsNotLocked - это классы ValidatorConstraint. Например, один из них выглядит так:

@ValidatorConstraint({ name: 'EntryIsNotLocked', async: false })
@Injectable()
export class EntryIsNotLocked implements ValidatorConstraintInterface {
    constructor(
        private readonly entryService: EntryService,
    ) {}

    public async validate(val: any, args: ValidationArguments): Promise<boolean> {
        // here goes some validation logic
    }

    public defaultMessage(args: ValidationArguments): string {
        return `Unauthorized to execute this action`;
    }
}

Второй выглядит точно так же. Итак, вопрос в том, могу ли я гарантировать порядок, установив для параметра async декоратора ValidatorConstraint значение false для них обоих?

1 Ответ

1 голос
/ 07 августа 2020

Нет, вы не можете быть уверены в последовательном порядке асинхронных c функций. Вот почему у вас есть метод validateSync в пакете класс-валидатора. Вы можете использовать метод validateSync вместо обычного метода validate для выполнения простой неасинхронной c проверки.

См. this для справки.

...