管道接收的嵌套参数

时间:2018-08-10 17:34:45

标签: nestjs

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

我有一个名为JoiValidationPipe的管道,该管道使用Joi对象验证请求的正文。一切正常,但是如果请求中同时包含body和param,我就会遇到问题:

@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,而不是正文。

我想知道是否有可能迫使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;
  }
}

1 个答案:

答案 0 :(得分:2)

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

例如

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

此处,管道仅应用于@Body。但是我没有使用@UsePipes,因为这不是必需/不希望的。