【发布时间】:2019-08-24 00:27:11
【问题描述】:
有没有办法在查询为空时使用默认值?
如果我有以下 DTO 用于查询:
export class MyQuery {
readonly myQueryItem: string;
}
而我的请求不包含任何查询,那么 myQuery.myQueryItem 将是未定义的。如何使它具有默认值?
【问题讨论】:
标签: javascript node.js typescript nestjs
有没有办法在查询为空时使用默认值?
如果我有以下 DTO 用于查询:
export class MyQuery {
readonly myQueryItem: string;
}
而我的请求不包含任何查询,那么 myQuery.myQueryItem 将是未定义的。如何使它具有默认值?
【问题讨论】:
标签: javascript node.js typescript nestjs
您可以直接在 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 重新安装您的依赖项。
npm ci,但没有任何改变。
@Query(new ValidationPipe())),对吗? tranform: true 到底是什么?为什么需要使用 DTO 的默认值,为什么不使用这些默认值?
只在你的 Dto 中像这样给出一个值:
export class MyQuery {
readonly myQueryItem: string = 'value default';
}
【讨论】:
myQueryItem 仍未定义。