繁体   English   中英

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

[英]How to use references (object values) at validation point in Joi?

我试图根据不同密钥key2的值有条件地验证密钥key1 key1来自某些值,假设['a', 'b', 'c']key2也应该受到约束,具体取决于key1的值{a: ['a1','a2','a3'], b: ['b1','b2','b3'], c: ['c1','c2','c3'] }

如果key1akey2必须是['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')])
}

我收到错误:

“无法使用undefined调用allow / valid / invalid”

我已经尝试了指定的选项图:

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

但这只能让我:

“选项必须至少有一个'那么'或'否则'”

如果我供应otherwise ,它也需要is 有没有简单的方法来解决这个问题?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM