如何在Joi的验证点使用引用(对象值)?

时间:2019-06-21 11:11:02

标签: javascript joi

我正在尝试根据不同密钥key1的值来有条件地验证密钥key2key1来自一组值,可以说['a', 'b', 'c']key2也应根据key1 {a: ['a1','a2','a3'], b: ['b1','b2','b3'], c: ['c1','c2','c3'] }的值进行约束。

如果key1a,则key2必须是['a1','a2','a3']等之一。key2的值集不能从{{1 }}。

我尝试使用ref遵循以下模式,希望key1会为我带来价值:

joi.ref('key1')

我得到了错误:

  

“无法通过未定义呼叫允许/有效/无效”

我已经尝试过使用指定的选项映射:

const obj = {a: ['a1','a2','a3'], b: ['b1','b2','b3'], c: ['c1','c2','c3'] }
const schema = {
  key1: joi.only(['a', 'b', 'c']),
  key2: joi.only(obj[joi.ref('key1')])
}

对于const schema = { key1: joi.only(['a', 'b', 'c']), key2: joi.only(joi.ref('key1', {map: [['a', ['a1','a2','a3']],['b', ['b1','b2','b3']],['c', ['c1','c2','c3']]]})) } ,我收到ValidationError:

  

“子代“ key2”失败,因为[“ key2”必须是[ref:key1]]之一

但是奇怪的是,{key1:'a', key2:'a1'}得到了验证而没有错误,这表明{key1:'a', key2:'a'}会退回到原始值。

因此,裁判未能按预期工作,请尝试何时切换:

joi.ref

但这只会让我失望

  

“选项必须至少具有'then'或'otherwise'中的一个”

如果我提供const schema = { key1: joi.only(['a', 'b', 'c']), key2: joi.when('key1', {switch: [{is: 'a', then: joi.only(['a1','a2','a3'])},{is: 'b', then: joi.only(['b1','b2','b3'])},{is: 'c', then: joi.only(['c1','c2','c3'])}]}) } ,它也需要otherwise。有什么简单的方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我建议您尝试两种不同的方法来解决您的问题。

第一个使用多个Joi.when()条件:

const schema = joi.object({
    key1: joi.array().items(joi.string().valid('a','b','c')).unique(),
    key2: joi.array()
        .when('key1', { is: ['a'], then: joi.array().items(joi.string().valid('a1','a2','a3')).unique(), otherwise: joi.forbidden() })
        .when('key1', { is: ['b'], then: joi.array().items(joi.string().valid('b1','b2','b3')).unique(), otherwise: joi.forbidden() })
        .when('key1', { is: ['c'], then: joi.array().items(joi.string().valid('c1','c2','c3')).unique(), otherwise: joi.forbidden() })
})

第二个使用Joi.alternatives()

const schema = joi.alternatives().try(
joi.object({
    key1: joi.array().items(joi.string().valid('a')).unique().required(),
    key2: joi.array().items(joi.string().valid('a1','a2','a3')).unique().required()
}),
joi.object({
    key1: joi.array().items(joi.string().valid('b')).unique().required(),
    key2: joi.array().items(joi.string().valid('b1','b2','b3')).unique().required()
}),
joi.object({
    key1: joi.array().items(joi.string().valid('c')).unique().required(),
    key2: joi.array().items(joi.string().valid('c1','c2','c3')).unique().required()
}))