Гнездо 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 поскольку это не требуется / желательно.

Другие вопросы по тегам