[英]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.