设置验证的默认值

时间:2017-03-24 20:53:35

标签: javascript node.js typescript hapijs joi

我正在使用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")
}

我在swagger中测试了它,默认值实际上变成了我设置的值。

但是,我的项目是用打字稿写的。我做了同样的事情并编译​​了打字稿代码。结果javascript看起来像这样:

 payload: {
    para1: Joi.number().required()["default"](1),
    para2: Joi.string()["default"]("defaultstring")
 }

在招摇时,不会应用默认值。

以下是我的问题:

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

    根据@ rsp的帖子,问题2中的格式只是访问对象属性的不同方式。我也可以从here获得参考。但它并没有解释它们是否有任何区别。有没有人有任何想法?

    UPDATE2

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

3 个答案:

答案 0 :(得分:2)

在JavaScript中:

for file in *; do
  [[ $file =~ ^IMG_([0-9]{4})([0-9]{2})([0-9]{2})_(.+\.(jpg|jpeg|png))$ ]] || continue
  mv "$file" "${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]} ${BASH_REMATCH[4]}"
done

与此相同:

required().default(1)

因为您可以访问对象属性:

required()["default"](1)

或:

object["propertyName"]

(在第二种情况下有某些限制)。

奇怪的是,TypeScript会输出更长的款式,如果它没有必要,但同样奇怪的是,较长的款式与它的工作方式完全不同。较短的一个。

我会尝试手动将已编译的JavaScript更改为较短版本,看看是否有帮助。如果它没有,则问题出在其他地方。我怀疑它无济于事。

object.propertyName 应该适用于TypeScript,因为它在@types/joi中定义 - 请参阅:

但另一方面有这样的评论:

.default()

这可能表明// TODO express type of Schema in a type-parameter (.default, .valid, .example etc) 实施尚未准备好 - 请参阅:

还有这个问题:.default()

答案 1 :(得分:0)

使用应使用默认(),如下面的代码所示:

 validate: {
        payload: {
            para1: Joi.number().integer().min(1).max(100).default(10).required(),
            para2: Joi.string().min(1).max(100).default("TEST").required(),
        }
    }

答案 2 :(得分:0)

当我们使用 Joi.boolean().required().default(true)

时它仍然说需要 key

以下对我有用

JOI.boolean().default(false)