【问题标题】:Nestjs validator constructor argument errorNestjs验证器构造函数参数错误
【发布时间】:2019-04-02 12:35:24
【问题描述】:

我正在尝试让嵌套验证器按照“管道”文档 (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;
  }
}

编译器抱怨:

Nest 无法解析 JoiValidationPipe (?) 的依赖关系。请 确保索引 [0] 处的参数在当前可用 上下文。

在控制器中

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

编译器抱怨一个参数给定为零。

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

【问题讨论】:

    标签: javascript node.js typescript nestjs joi


    【解决方案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);
    }
    

    【讨论】:

    • 不,这没有任何区别。引发错误的是 JoiValidationPipe 的构造函数。 “模式”需要类型吗?
    • 实际上,@UsePipes@Body 都为我工作。如果我在没有 new 的情况下编写 @UsePipes(JoiValidationPipe) 并传递架构,我只能重现您的问题。你确定你没有另一个这样的控制器吗?您将什么模式传递给管道?您还可以尝试从管道定义中删除 @Injectable()。它也应该在没有 DI 的情况下工作。
    • 很有趣,我很高兴你重写了 Joi.object ;我没有正确传递模式,但即便如此它仍然无法编译,直到我从管道中删除 @Injectable 。现在它起作用了!它应该与@Injectable 一起使用吗?
    • 它应该与@Injectable() 一起使用,并且对我有用。您确定这是您代码中唯一使用JoiValidationPipe 的地方吗?如果这不起作用,可以尝试像npm update 这样的常用方法,然后扔掉node_modules 并重新安装。或者您可以像我一样尝试在空项目中重现错误,并尝试找出导致错误的差异。
    • 从 app.module 中移除 JoiValidationPipe 作为提供者解决了这个问题。我认为所有可注射剂都必须在模块级别声明。好像没有!
    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2014-07-06
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多