NestJS: Как получить доступ к Body и Param в пользовательском валидаторе? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть сценарий, в котором мне нужны значения из обоих значений в param и body для выполнения пользовательской проверки.Например, у меня есть маршрут /:photoId/tag, который добавляет тег к фотографии.

Однако, прежде чем он сможет добавить тег к фотографии, он должен проверить, существует ли уже существующий тегто же имя с фотографией.

В моем контроллере есть следующий маршрут:

@Post(':photoId/tag')
@UsePipes(new ValidationPipe())
async addTag(
    @Param() params: AddTagParams,
    @Body() addTagDto: AddTagDto
) {
    // ...
}

Поскольку :photoId предоставляется как param и tag предоставляется в теле запроса, они не могут обращаться друг к другу в пользовательском валидаторе, и я не могу использовать обе части информации для проверки базы данных:

export class IsPhotoTagExistValidator implements ValidatorConstraintInterface {

    async validate(val: any, args: ValidationArguments) {
        // supposed to check whether a tag of the same name already exists on photo
        // val only has the value of photoId but not the name of the tag from AddTagDto in Body
    }
}   


export class AddTagParams{
   @IsInt()
   @Validate(IsPhotoTagExistValidator)   // this doesn't work because IsPhotoTagExistValidator can't access tag in AddTagDto
   photoId: number
}

export class AddTagDto{
   @IsString()
   tag: string
}

Как и в примере выше, val в IsPhotoTagExistValidator - это только photoId.Но мне нужно и photoId в параметре, и tag имя в теле, чтобы проверить, есть ли у конкретного photoId это tag.

Как мне получить доступ к телу и параметру впользовательская функция валидатора?Если нет, то как мне подойти к этой проблеме?

...