簡體   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