【问题标题】:Joi, validate different array schemas based on array lengthJoi,根据数组长度验证不同的数组模式
【发布时间】:2019-03-15 22:33:00
【问题描述】:

我一直在努力解决 Joi 的问题,我使用了大量不同的语法来尝试解决它。​​

基本上我们有以下两种模式。假设下拉菜单中有 5 个选项。如果数组只有一项,则只需要 arraySchemaOne,如果它有多个项,则需要架构一和架构二。

const arraySchemaOne = Joi.object({
    dropdown: Joi.string().valid('Option 1')
}).required();

const arraySchemaTwo = Joi.object({
    dropdown: Joi.string().valid('Option 2')
}).required();

this.validationPattern = Joi.object().pattern(/\w/, Joi.object(
    {
          rows: Joi.ref('rows.length >= 2')
          ?
          Joi.array().items([arraySchemaOne, arraySchemaTwo])
          :
          Joi.array().items([arraySchemaOne])
    }
));

如果有人有任何语法可以帮助解决这个问题,那就太好了。这几天我尝试了很多东西,都无法解决这个问题。

【问题讨论】:

  • 嗨@KatherineGG28你有理由使用Joi作为前端吗? Joi 对于浏览器验证不是很好,Yup 是具有类似 API 的浏览器替代品。另外,您能否解释一下您在数据方面而不是模式方面试图实现的目标?
  • Joi 是由另一位工程师介绍的,在其他所有情况下,它都非常适合我们的数据模式。基本上我有一个对象数组。当数组中只有一项时,下拉菜单的值必须为选项 1,当两项在其中时,一项的值必须为选项 1,另一项的值必须为选项 2。当有两个以上的项时说 5项目,其中一个必须具有选项 1 的值,另一个必须具有选项 1,但其他 3 可以是任何值。

标签: javascript reactjs validation joi


【解决方案1】:

@katherineGG28 您可能想查看以下文档,joi API 公开了一个 when 方法,您可以在其中将已有的 ref 作为第一个参数传递,然后使用您的替代模式填充选项。附带说明一下,如果另一位工程师介绍了该库,您至少应该查看 repo 中的 README 文件,该文件清楚地指出该库不是为浏览器设计的。

https://github.com/hapijs/joi/blob/v14.3.1/API.md#anywhencondition-options

【讨论】:

  • 是的,我想当您没有到达页面底部时会发生这种情况,但是您想要的实现已包含在提供的 api 中。 github.com/hapijs/joi#browsers
  • 我不认为切换到 Yup 会导致自动解决这个案例。问题似乎不是基于数组长度是否为某个数字来验证对象数组的简单方法。这不是使用哪个验证 API 的问题,而是如何处理某种验证情况的问题。
猜你喜欢
  • 2020-12-11
  • 2019-04-07
  • 1970-01-01
  • 2021-02-05
  • 2017-07-28
  • 2014-11-02
  • 1970-01-01
  • 2019-09-03
  • 2017-06-25
相关资源
最近更新 更多