У меня есть сценарий, в котором мне нужны значения из обоих значений в 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
.
Как мне получить доступ к телу и параметру впользовательская функция валидатора?Если нет, то как мне подойти к этой проблеме?