【问题标题】:Joi validation - allow field to be optional but when supplied must be a positive integerJoi 验证 - 允许字段是可选的,但提供时必须是正整数
【发布时间】:2021-09-09 04:09:22
【问题描述】:

我在 JOI 模式中有一个字段,我希望它是可选的(即接受 undefined,也接受 null),但是如果提供了它的值,它必须是一个正整数。我该如何实现这一目标?

这是我迄今为止尝试过的,验证字段为“容量”,但它似乎不起作用,似乎“.when”语句被忽略了:

const divebarSchema = joi.object({
  divebar: joi
    .object({
      title: joi.string().required(),
      capacity: joi.optional().allow(null),
      description: joi.string().required(),
      location: joi.string().required(),
      image: joi.string().optional().allow(""),
      map: joi.string().optional().allow(""),
    })
    .required()
    .when(joi.object({ capacity: joi.exist() }), {
      then: joi.object({ capacity: joi.number().integer().min(0) }),
    }),
});

在上述之前我最初没有 .when 而是容量规则是:

  capacity: joi.number().optional().allow(null).integer().min(0),

但是这也不起作用,它在提交空值时不断抛出错误“必须是数字”。

【问题讨论】:

  • 您是否尝试过完全删除 when ,而在原始对象中只包含 capacity: joi.integer().min(0)
  • @khenriksson 感谢您的评论。 capacity: joi.integer().min(0) 不起作用,因为我相信 .integer 仅适用于 joi.number。但是容量:joi.number().integer().min(0) 不是我想要的,因为它不允许空值。我已经尝试添加 allow(null) 规则但没有成功 - 我更新了我的问题描述以解释我事先尝试过的内容。
  • 尝试在 joi.object() 之后删除 .required()
  • @Sudhir 感谢您的评论,但恐怕这并没有改变任何东西,似乎.while 仍然被忽略了。此外,删除 .required 不是我想要做的,因为我希望整个对象在传入请求中是强制性的。

标签: javascript node.js express validation joi


【解决方案1】:

根据 Joi 文档 optional 不包括 null 您需要使用 allow

capacity: Joi.number().optional().integer().min(0).allow(null)

【讨论】:

  • 感谢您的帖子。你的意思是完全取出.when,并将我的容量规则更改为capacity: joi.number().optional().integer().min(0).allow(null)?这基本上是我首先尝试的,唯一的区别是我的.allow().optional() 之后。我尝试按照您的建议重新订购它,但不幸的是它没有任何区别。
  • 正确。我在 joi 沙箱中试用了该规则,它适用于场景 {}、{容量:null} 和 {容量:3}。实际上 optional 似乎是多余的,即使它被删除也可以工作
  • 嗯,这很奇怪。在我的应用程序中,当我尝试您所说的内容时,我仍然收到容量的“必须是数字”错误:null
  • @Yob 你确定你的null 不是字符串吗?您是否尝试添加.allow(null, "null")
  • @soltex 感谢您的评论。我试过了,不幸的是也没有用。
猜你喜欢
  • 2019-10-16
  • 2017-01-22
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多