【问题标题】:Is it possible to set default values for a DTO?是否可以为 DTO 设置默认值?
【发布时间】:2019-08-24 00:27:11
【问题描述】:

有没有办法在查询为空时使用默认值?

如果我有以下 DTO 用于查询:

export class MyQuery {
  readonly myQueryItem: string;
}

而我的请求不包含任何查询,那么 myQuery.myQueryItem 将是未定义的。如何使它具有默认值?

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    您可以直接在 DTO 类中设置默认值:

    export class MyQuery {
      readonly myQueryItem = 'mydefault';
    }
    

    您必须实例化该类以便使用默认值。例如,您可以使用ValidationPipetransform: true 选项。如果该值由您的查询参数设置,它将被覆盖。

    @Get()
    @UsePipes(new ValidationPipe({ transform: true }))
    getHello(@Query() query: MyQuery) {
      return query;
    }
    

    为什么会这样?

    1) 管道应用于所有装饰器,例如@Body()@Param()@Query() 并且可以转换值(例如ParseIntPipe)或执行检查(例如ValidationPipe)。

    2) ValidationPipe 在内部使用 class-validatorclass-transformer 进行验证。为了能够对您的输入(纯 javascript 对象)执行验证,它首先必须将它们转换为您的带注释的 dto 类,这意味着它会创建您的类的一个实例。使用transform: true 设置,它会自动创建你的 dto 类的实例。

    示例(基本上是如何工作的):

    class Person {
      firstname: string;
      lastname?: string = 'May';
    
      constructor(person) {
        Object.assign(this, person);
      }
    }
    
    // You can use Person as a type for a plain object -> no default value
    const personInput: Person = { firstname: 'Yuna' };
    
    // When an actual instance of the class is created, it uses the default value
    const personInstance: Person = new Person(personInput);
    

    【讨论】:

    • 我试过这样做。首先,我必须npm install class-validator。然后我在发送请求时在控制台中收到以下消息:No metadata found. There is more than once class-validator version installed probably. You need to flatten your dependencies。而且我无法理解出了什么问题(谷歌在这里没有帮助)。
    • 是的,您需要同时安装class-validatorclass-transformer。确保class-validator 在您的package.json 中仅列出一次。然后尝试使用npm ci 重新安装您的依赖项。
    • 我确保我的 package.json 中包含这两个包一次,并做了npm ci,但没有任何改变。
    • 您能解释一下 ValidationPipe 的工作原理吗?现在我仍然无法获得它的魔力。 ValidationPipe 是一种中间件,对吧?我可以将它应用于函数(如我们的示例中),或特定的 DTO (@Query(new ValidationPipe())),对吗? tranform: true 到底是什么?为什么需要使用 DTO 的默认值,为什么不使用这些默认值?
    • 这不适用于类验证器
    【解决方案2】:

    只在你的 Dto 中像这样给出一个值:

    export class MyQuery {
      readonly myQueryItem: string = 'value default';
    }
    

    【讨论】:

    • 遗憾的是这对我不起作用。 myQueryItem 仍未定义。
    猜你喜欢
    • 2014-10-15
    • 2021-07-22
    • 1970-01-01
    • 2017-06-09
    • 2019-04-05
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多