[英]How to use Joi to validate map object (map keys and map values)
[英]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'] }
。
如果key1
是a
則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')])
}
我收到錯誤:
“無法使用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.ref
回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'])}]})
}
但這只能讓我:
“選項必須至少有一個'那么'或'否則'”
如果我供應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.