这是我的架构的简单版本。
var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string(),
c: Joi.string()
});
我希望a,b,c正好是3个非空中的2个。即:
尝试使用.or()
,但显然没有做到这一点。看着.alternatives()
,但没有让它发挥作用。
答案 0 :(得分:1)
找到一种优雅的方法来处理这个问题并不会遇到循环依赖问题,这很棘手。我设法使用.alternatives()
和.try()
来处理某些工作。
原始形式的解决方案是:
Joi.alternatives().try(
Joi.object().keys({
a: Joi.string().required(),
b: Joi.string().required(),
c: Joi.string().required().valid('')
}),
Joi.object().keys({
a: Joi.string().required().valid(''),
b: Joi.string().required(),
c: Joi.string().required()
}),
Joi.object().keys({
a: Joi.string().required(),
b: Joi.string().required().valid(''),
c: Joi.string().required()
})
);
它肯定不漂亮,如果引入更多依赖项,它可能会变得非常臃肿。
为了减少重复次数,以下内容也适用:
var base = {
a: Joi.string().required(),
b: Joi.string().required(),
c: Joi.string().required()
};
Joi.alternatives().try(
Joi.object().keys(Object.assign({}, base,
{
a: base.a.valid('')
})),
Joi.object().keys(Object.assign({}, base,
{
b: base.b.valid('')
})),
Joi.object().keys(Object.assign({}, base,
{
c: base.c.valid('')
}))
);