设置验证的默认值
Set default value of validation
我正在使用 Joi 来验证我的 node.js 服务器中使用 hapijs 框架的服务的有效负载。它曾经看起来像这样(在我的打字稿代码中以及编译为 javascript 之后):
payload: {
para1: Joi.number().required(),
para2: Joi.string()
}
现在我想设置两个参数的默认值。如果代码写成javascript,我可以这样做:
payload: {
para1: Joi.number().required().default(1),
para2: Joi.string().default("defaultstring")
}
我大摇大摆地测试了一下,默认值竟然变成了我设置的值
但是,我的项目是用打字稿写的。我做了同样的事情并编译了打字稿代码。结果 javascript 如下所示:
payload: {
para1: Joi.number().required()["default"](1),
para2: Joi.string()["default"]("defaultstring")
}
在 swagger 中,不应用默认值。
这是我的问题:
- 为什么编译后代码不一样?
["default"]("defaultstring")
是什么意思,有什么作用?
- 如何编写 typescript 代码以确保它可以编译为
Joi.string().default("defaultstring")
更新
根据@rsp 的 post,问题 2 中的格式只是访问对象 属性 的不同方式。我也从 here 获得参考。但这并不能解释它们是否有任何区别。有人知道吗?
更新2
Here是两种访问JS方式的区别属性。使用括号方式似乎没有负面影响。但是,就我而言,默认值并未反映在 swagger 上。将对此进行研究。
在JavaScript这个:
required().default(1)
与此相同:
required()["default"](1)
因为您可以通过以下方式访问对象属性:
object["propertyName"]
或:
object.propertyName
(第二种情况有一定的限制)
所以很奇怪 TypeScript 会输出较长的样式,如果它不需要的话,但也很奇怪,较长的样式与较短的样式并不完全相同。
我会尝试手动将已编译的 JavaScript 更改为较短的版本,看看是否有帮助。如果没有,则问题出在其他地方。我怀疑它无济于事。
.default()
应该在 TypeScript 中工作,因为它在 @types/joi 中定义 - 请参阅:
但另一方面有这样的评论:
// TODO express type of Schema in a type-parameter (.default, .valid, .example etc)
这可能表明 .default()
实施尚未准备就绪 - 请参阅:
还有这个问题:joi.d.ts out of date, missing types
使用应该像下面的代码一样使用 default():
validate: {
payload: {
para1: Joi.number().integer().min(1).max(100).default(10).required(),
para2: Joi.string().min(1).max(100).default("TEST").required(),
}
}
当我们使用Joi.boolean().required().default(true)
时仍然说需要密钥
以下对我有用
JOI.boolean().default(false)
taxAmount: Joi.number().default(0),
totalAmount: Joi.number().default(0),
这对我有用。不要使用 .reqquired()
关键字。
结果将在
const validationResult = schema.validate(data);
validationResult.value
我正在使用 Joi 来验证我的 node.js 服务器中使用 hapijs 框架的服务的有效负载。它曾经看起来像这样(在我的打字稿代码中以及编译为 javascript 之后):
payload: {
para1: Joi.number().required(),
para2: Joi.string()
}
现在我想设置两个参数的默认值。如果代码写成javascript,我可以这样做:
payload: {
para1: Joi.number().required().default(1),
para2: Joi.string().default("defaultstring")
}
我大摇大摆地测试了一下,默认值竟然变成了我设置的值
但是,我的项目是用打字稿写的。我做了同样的事情并编译了打字稿代码。结果 javascript 如下所示:
payload: {
para1: Joi.number().required()["default"](1),
para2: Joi.string()["default"]("defaultstring")
}
在 swagger 中,不应用默认值。
这是我的问题:
- 为什么编译后代码不一样?
["default"]("defaultstring")
是什么意思,有什么作用?- 如何编写 typescript 代码以确保它可以编译为
Joi.string().default("defaultstring")
更新
根据@rsp 的 post,问题 2 中的格式只是访问对象 属性 的不同方式。我也从 here 获得参考。但这并不能解释它们是否有任何区别。有人知道吗?
更新2
Here是两种访问JS方式的区别属性。使用括号方式似乎没有负面影响。但是,就我而言,默认值并未反映在 swagger 上。将对此进行研究。
在JavaScript这个:
required().default(1)
与此相同:
required()["default"](1)
因为您可以通过以下方式访问对象属性:
object["propertyName"]
或:
object.propertyName
(第二种情况有一定的限制)
所以很奇怪 TypeScript 会输出较长的样式,如果它不需要的话,但也很奇怪,较长的样式与较短的样式并不完全相同。
我会尝试手动将已编译的 JavaScript 更改为较短的版本,看看是否有帮助。如果没有,则问题出在其他地方。我怀疑它无济于事。
.default()
应该在 TypeScript 中工作,因为它在 @types/joi 中定义 - 请参阅:
但另一方面有这样的评论:
// TODO express type of Schema in a type-parameter (.default, .valid, .example etc)
这可能表明 .default()
实施尚未准备就绪 - 请参阅:
还有这个问题:joi.d.ts out of date, missing types
使用应该像下面的代码一样使用 default():
validate: {
payload: {
para1: Joi.number().integer().min(1).max(100).default(10).required(),
para2: Joi.string().min(1).max(100).default("TEST").required(),
}
}
当我们使用Joi.boolean().required().default(true)
以下对我有用
JOI.boolean().default(false)
taxAmount: Joi.number().default(0),
totalAmount: Joi.number().default(0),
这对我有用。不要使用 .reqquired()
关键字。
结果将在
const validationResult = schema.validate(data);
validationResult.value