繁体   English   中英

带有 Joi 的条件数组项

[英]Conditional array items with Joi

我在为此输入创建 Joi 模式时遇到问题

{
  projects: ["*","ABC123","ABC456"]
}

使用上面的输入,它应该会抛出一个错误。

我确实尝试过像这样使用Joi.alternatives()

const schema = Joi.object({
  projects: 
    Joi.array()
    .items(
      Joi.alternatives(
        Joi.string().equal('*'), 
        Joi.string().regex(new RegExp(/^ABC_([0-9]{3,3})$/))
      )
    )
})

但它似乎同时允许["*"]["ABC123","DEF456"] 我希望它是["*"]["ABC123","DEF456"] ,否则会出错。

我怎样才能真正通过使用 Joi 来实现它?

你可以尝试这样的事情:

const schema = Joi.object({
  projects: Joi.alternatives(
    Joi.array().length(1).items(
      Joi.string().equal('*')
    ),
    Joi.array().items(
      Joi.string().regex(/^ABC[0-9]{3}$/)
    )
  )
});

也就是说,具有两个替代数组模式,而不是具有具有替代元素模式的单个数组模式。

如果您想拒绝 arrays,则.length(1)可以拒绝["*", "*"]之类的值,否则可以省略。

此外,正则表达式可以用更简单的方式编写,所以我简化了它,但我想这只是一个例子,所以这并不重要。 但重要的是我从正则表达式中删除了下划线(“_”),因为您示例中的正则表达式不匹配示例中的值,例如“ABC123”,而是例如“ABC_123”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM