【问题标题】:Set default value of validation设置验证的默认值
【发布时间】:2017-08-17 22:49:40
【问题描述】:

我正在使用 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 中的格式只是访问对象属性的不同方式。我还从here 获得了参考。但它并没有解释它们是否有任何区别。有人知道吗?

更新2

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

【问题讨论】:

  • 终于想通了。当我使用 typescript 时,swagger notes 是从 typescript 初始函数生成的,而不是从 JS 文件生成的。代码本身没有问题。

标签: javascript node.js typescript hapijs joi


【解决方案1】:

在 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

【讨论】:

  • 感谢您的回答。很高兴知道在 JS 中还有另一种访问对象的方法。可能我无法为您提供解决方案,因为更改已编译的 JavaScript 不是处理该问题的可持续方式。我在开发软件时使用 gulp。因此,每次我更改某些内容时,所有文件都会重新编译。
  • 如果@types/joi 没有很好的开发,为什么它仍然被编译为更长的样式JS?
【解决方案2】:

应使用 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.validate() 中,结果没有默认值
【解决方案3】:

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

以下内容对我有用

JOI.boolean().default(false)

【讨论】:

    【解决方案4】:
    taxAmount: Joi.number().default(0),
    totalAmount: Joi.number().default(0),
    

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

    const validationResult = schema.validate(data);
    validationResult.value
     
    

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 1970-01-01
      • 2015-07-12
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多