Joi:要求三个字段中的两个非空

时间:2018-01-17 16:53:29

标签: joi

这是我的架构的简单版本。

var schema = Joi.object().keys({
    a: Joi.string(),
    b: Joi.string(),
    c: Joi.string()
});

我希望a,b,c正好是3个非空中的2个。即:

  • 如果a,b不为空,则不应设置c
  • 带有a,b,c
  • 的圆形排列的同义词
  • 当然,如果2个或更多是空的,也会抛出错误

尝试使用.or(),但显然没有做到这一点。看着.alternatives(),但没有让它发挥作用。

1 个答案:

答案 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('')
    }))
);