是否可以为 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';
您必须实例化该类以便使用默认值。例如,您可以使用ValidationPipe
和transform: true
选项。如果该值由您的查询参数设置,它将被覆盖。
@Get()
@UsePipes(new ValidationPipe( transform: true ))
getHello(@Query() query: MyQuery)
return query;
为什么会这样?
1) 管道应用于所有装饰器,例如@Body()
、@Param()
、@Query()
并且可以转换值(例如ParseIntPipe
)或执行检查(例如ValidationPipe
)。
2) ValidationPipe
在内部使用 class-validator
和 class-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-validator
和class-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 设置默认值?的主要内容,如果未能解决你的问题,请参考以下文章