Nestjs验证程序构造函数参数错误

时间:2018-10-29 14:39:36

标签: javascript node.js typescript nestjs joi

我正在尝试使嵌套验证器按“管道”文档(https://docs.nestjs.com/pipes)部分“对象模式验证”中的示例工作。我正在尝试使用Joi的示例,除了将模式从控制器传递到验证服务之外,该示例均有效。

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

编译器抱怨:

  

嵌套无法解析JoiValidationPipe(?)的依赖项。请   确保索引[0]处的参数在当前   上下文。

在控制器中

@Post()
@UsePipes(new JoiValidationPipe(createCatSchema))
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

在给定预期值为零的情况下,编译器抱怨一个参数。

这似乎是一个声明问题,但我真的不知道。为什么这不起作用,如何将架构传递给服务?

1 个答案:

答案 0 :(得分:1)

正如您所说,JoiValidationPipe必须在任何模块中都声明为提供程序。


我只能用以下代码重现错误(不传递模式):

@UsePipes(JoiValidationPipe)
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}

请确保您的代码中没有此位置。

这对我有用:

@UsePipes(new JoiValidationPipe(Joi.object().keys({ username: Joi.string().min(3) })))
async create(@Body() createCatDto: CreateCatDto) {
  this.catsService.create(createCatDto);
}