访问 JOI ref,其中键包含点

问题描述

我正在尝试基于带有 JOI 架构的上下文选项进行相关验证。

let context = {
  "User.HasChildren": false,}

let schema = Joi.object({
  "User.HasChildren": Joi.boolean(),"User.Children": Joi.when("$User.HasChildren",{
    is: true,then: Joi.number().min(0).required(),otherwise: Joi.any().forbidden()
  }),"User.ChildsYoungestAge": Joi.when("$User.HasChildren",then: Joi.when("$User.Children",{
      is: Joi.number().min(0),then: Joi.number().required(),otherwise: Joi.any().forbidden()
    }),otherwise: Joi.any().forbidden()
  })
});

schema.validate({
    "User.HasChildren": true,"User.Children": 4,"User.ChildsYoungestAge": 4
  },{ context });

基本上是键名中的 . 导致了失败。如果我去掉 .,我会得到预期的结果,但我无法控制密钥名称,因为它来自 API 响应对象。

我曾尝试更改 options 中的分隔符,但没有成功,我如何告诉 JOI . 是它们引用/键的一部分?

解决方法

经过额外的分析后,我意识到我在正确的轨道上,但没有正确定义分隔符。基本上我尝试在验证函数中设置它,但它需要单独定义到一个引用。

let context = {
  "User.HasChildren": false,}

let schema = Joi.object({
  "User.HasChildren": Joi.boolean(),"User.Children": Joi.when(Joi.ref("$User.HasChildren",{ separator: false }),{
    is: true,then: Joi.number().min(0).required(),otherwise: Joi.any().forbidden()
  }),"User.ChildsYoungestAge": Joi.ref("$User.HasChildren",then: Joi.when(Joi.ref("$User.Children",{
      is: Joi.number().min(0),then: Joi.number().required(),otherwise: Joi.any().forbidden()
    }),otherwise: Joi.any().forbidden()
  })
});

schema.validate({
    "User.HasChildren": true,"User.Children": 4,"User.ChildsYoungestAge": 4
  },{ context });