Гнездо param получено по трубе
Поэтому при разработке простых конечных точек REST с помощью nestjs
Я нашел небольшую проблему.
У меня есть трубка по имени JoiValidationPipe
которые проверяют тело запроса, используя объект Joi. все работает, но у меня есть проблема, если запрос содержит и тело, и параметр:
@Patch(':id')
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async updateComic(@Body() comic: Comic, @Param() params) {
comic.id = params.id;
return await this.comicService.update(comic);
}
здесь параметр, полученный JoiValidationPipe, является просто id
в URL запроса, а не в теле.
Я хочу знать, возможно ли заставить трубу получить тело запроса.
эта проблема не существует, если в URL нет параметра, JoiValidatinPipe
автоматически получить тело.
Создать комикс
@Post()
@UsePipes(new JoiValidationPipe(CreateComicSchema))
async createComic(@Body() comic: Comic) {
return await this.comicService.create(comic);
}
JoiValidationPipe
import * as Joi from 'joi';
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class JoiValidationPipe implements PipeTransform {
constructor(private readonly schema) {}
transform(value: any, metadata: ArgumentMetadata) {
const { error } = Joi.validate(value, this.schema);
if (error) {
throw new BadRequestException('Validation failed');
}
return value;
}
}
1 ответ
Лучшее использование Pipes
проверить только некоторые специфические типы параметров (среди Body
, Param
и т. д.) - указывать класс (или экземпляр) в качестве параметра этих декораторов.
например
async updateComic(@Body(new ValidationPipe({ whitelist: true }) comic: Comic, @Param() params) {
здесь труба применяется только к @Body
, Но я не использовал @UsePipes
поскольку это не требуется / желательно.