是否可以为DTO设置默认值?

时间:2019-04-02 15:49:01

标签: javascript node.js typescript nestjs

查询为空时是否可以使用默认值?

如果我要查询以下DTO:

export class MyQuery {
  readonly myQueryItem: string;
}

并且我的请求不包含查询,那么myQuery.myQueryItem将不确定。如何使其具有默认值?

2 个答案:

答案 0 :(得分:2)

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

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

您必须实例化该类,以便使用默认值。为此,您可以例如将ValidationPipe与选项transform: 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);

答案 1 :(得分:0)

仅在Dto中提供一个值,如下所示:

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