【问题标题】:How to use references (object values) at validation point in Joi?如何在 Joi 的验证点使用引用(对象值)?
【发布时间】:2019-06-21 21:02:43
【问题描述】:

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

如果key1a,那么key2 必须是['a1','a2','a3'] 等之一。key2 的值集不能从key1 计算。

我尝试了以下模式,使用 ref,希望 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']]]}))
}

对于{key1:'a', key2:'a1'},我得到了ValidationError:

"child "key2" 失败,因为 ["key2" 必须是 [ref:key1]] 之一]

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

所以 refs 没有按预期工作,让我们尝试何时切换:

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'])}]})
}

但这只能让我明白:

"选项必须至少有 'then' 或 'otherwise' 之一"

如果我提供otherwise,它还需要is。有什么简单的方法可以解决这个问题吗?

【问题讨论】:

    标签: javascript joi


    【解决方案1】:

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

    第一个使用多个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()
    }))
    

    【讨论】:

    • 感谢您的回答。这当然会起作用,但是我正在寻找更具动态性的东西,具体取决于“obj”对象。
    猜你喜欢
    • 2016-10-11
    • 2020-03-14
    • 2019-12-13
    • 2021-06-26
    • 2018-02-27
    • 2017-08-05
    • 2021-10-10
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多