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

Posted

技术标签:

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

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

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

export class MyQuery 
  readonly myQueryItem: string;

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

【问题讨论】:

【参考方案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 仍未定义。

以上是关于是否可以为 DTO 设置默认值?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将默认值设置为缺少/可选的 JSON 属性?

是否可以在大文本通知中将扩展通知设置为默认值?

将 CSS 显示属性重置为默认值

我可以在 Spring MVC 的 RequestMapping 中为路径变量设置默认值吗?

mysql default默认值 空白怎么弄?

mysql表字段默认值