管道接收到的嵌套参数

Nest param received by pipe

所以在使用 nestjs 开发简单的 REST 端点时,我发现了一个小问题。

我有一个名为 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接收到的参数只是请求url中的id,不是body.

我想知道是否可以强制 Pipe 接收请求的主体。

如果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;
      }
    }

Pipes 仅验证某些特定类型参数(BodyParam 等)的最佳用途是给出一个 class(或实例) 作为这些装饰器的参数。

例如

async updateComic(@Body(new ValidationPipe({ whitelist: true }) comic: Comic, @Param() params) {

这里,管道仅应用于@Body。但是我没有使用 @UsePipes 因为这不是 required/desired.