带有 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”。
我在为此输入创建 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”。