joi 根据另一个字段设置布尔默认值

问题描述

假设我有一个带有两个键 a 和 b 的对象。 a 是字符串,b 是布尔值。我正在寻找的是,如果 a 为空,则 b 的认值为 true 如果不是 false。

这个架构

Joi.object({
  'a': Joi.string(),'b': Joi.alternatives()
    .when('a',{
      is: '',then: Joi.boolean().default(true),otherwise: Joi.boolean().default(false)
    })
})

对象抛出错误“无法将替代项与布尔值组合”

{ 
 a: '',b: false
}

这可能超出了 Joe 的意思,但我很好奇。

解决方法

.default() 可以接受带有参数的函数(父级、助手),通过父级你可以访问任何对象值并执行如下操作:

const schema = Joi.object({
    a: Joi.string().allow(''),b: Joi.boolean().default((parent) => parent.a == '')
})

// Object {value: Object {a: "",b: true}}
schema2.validate({ a: '' })
// Object {value: Object {a: "",b: false}}
schema2.validate({ a: 'aaa' })