带有 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}$/)
    )
  )
});

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

如果您想拒绝这样的数组,.length(1) 可以拒绝像 ["*", "*"] 这样的值,否则可以省略。

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