9

我正在使用 Joi 使用 hapijs 框架在我的 node.js 服务器中验证服务的有效负载。它曾经看起来像这样(在我的打字稿代码以及编译为 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 中,不应用默认值。

以下是我的问题:

  1. 为什么编译后代码变得不同?
  2. 是什么["default"]("defaultstring")意思,它有什么作用?
  3. 我如何编写打字稿代码以确保它可以编译为Joi.string().default("defaultstring")

更新

根据@rsp 的帖子,问题2 中的格式只是访问对象属性的不同方式。我也从这里得到参考。但它并没有解释它们是否有任何区别。有人有什么主意吗?

更新2

是访问 JS 属性的两种方式之间的区别。使用括号的方式似乎没有负面影响。但是,就我而言,默认值不会反映在 swagger 上。将对其进行研究。

4

4 回答 4

6

在 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

于 2017-03-24T21:16:55.583 回答
0
taxAmount: Joi.number().default(0),
totalAmount: Joi.number().default(0),

这对我有用。不要使用.reqquired()关键字。结果将在

const validationResult = schema.validate(data);
validationResult.value
 
于 2022-01-11T12:40:46.703 回答
0

它仍然说我们使用时需要密钥Joi.boolean().required().default(true)

以下对我有用

JOI.boolean().default(false)
于 2021-03-25T05:45:13.810 回答
0

使用应该像下面的代码一样使用 default():

 validate: {
        payload: {
            para1: Joi.number().integer().min(1).max(100).default(10).required(),
            para2: Joi.string().min(1).max(100).default("TEST").required(),
        }
    }
于 2017-03-28T07:47:02.487 回答