如何在Joi中处理嵌套时间?

时间:2019-04-23 18:29:10

标签: javascript joi

我试图期待一个类似于以下对象的对象,其中仅当未发送主对象时才允许数据。

{
  "action": {
    "primary": "",
    "data": {}
  }
}

我尝试过以下模式:

Joi.object({
  action: Joi.object({
    primary: Joi.any(),
    data: Joi.any(),
  })
  .when(Joi.object({
    action: Joi.object({
      primary: Joi.exist()
    })
  }), {
    then: Joi.object({
      primary: Joi
        .string()
        .required(),
      data: Joi.any().forbidden()
    }),
    otherwise: Joi.object({
      primary: Joi.any().forbidden(),
      data: Joi.object()
      .required()
    })
  })
});

它总是进入我的otherwise语句中。其他语法也总是失败:.when('primary', { is: Joi.exist(), then:

当我尝试.when('action.primary', { is: Joi.exist(), then:时,Joi自身会因AssertionError [ERR_ASSERTION]: Item cannot come after itself: action而出错

1 个答案:

答案 0 :(得分:0)

我可以建议以下重构吗?

Joi.object({
  action: Joi.object({
    primary: Joi.string(),
    data: Joi.object().when("primary", {
      is: Joi.exist(),
      then: Joi.forbidden(),
      otherwise: Joi.required()
    })
  })
});

它允许这两个对象:

{
  action: {
    data: {}
  }
};
{
  action: {
    primary: "value"
  }
};

注意:https://github.com/legraphista/joi-tester是一个很酷的项目,用于在不设置应用程序的情况下验证Joi配置。