javascript:JOI 有条件合并字段

问题描述 投票:0回答:1

尚未找到适合我的案例的任何有效解决方案,因此我正在创建一个新的解决方案。 我有这个架构:

function getParts1() {
  return {
    common: joi.object({
      common_key: joi.number().integer().required(),
      common_conditional: joi.string().valid("AB", "CD", "EF").required(),
      common_value1: joi.string().max(144).required(),
    }),

    variation1: joi.object({
      field1: joi.number().allow(0).required(),
      field2: joi.string().max(255).allow("").required(),
    }),

    variation2: joi.object({
      another_field1: joi.number().allow(0).required(),
      another_field2: joi.string().max(255).allow("").required(),
    }),

    variation3: joi.object({
      super_another_field1: joi.number().allow(0).required(),
      super_another_field2: joi.string().max(255).allow("").required(),
    }),
  };
}

function getParts2() {}; //And much more functions like getParts1 with the same keys but different objects as values 

我需要创建一个可以通过以下方式处理此类函数的输出的函数:

  • 最初它会从结果数组中获取
    common
    部分。
  • 然后它有条件地合并其他变体,条件基于
    common_conditional
    的值。在此示例中,我需要从
    array.common
    if
    array.variation1
    array.common.common_conditional == "AB"
    if
    variation2
    等合并到
    "CD"
    键。它还可以更多。

由于每个

joi.object(...)
variation
的差异,我找不到解决这个问题的方法。
例如,对于上面的代码,如果将创建这样的模式:

Parts

它应该通过 res1 和 res2,但 res3 应该抛出 
const schema = getSchemaFromParts(getParts1()); const data1 = { common_key: 12, common_conditional: "AB", common_value1: "somevalue", field1: 14, field2: "Value for field2" } const data2 = { common_key: 16, common_conditional: "CD", common_value1: "somevalue2", another_field1: 18, another_field2: "Hello world" } const data3 = { common_key: 16, common_conditional: "EF", common_value1: "somevalue3", another_field1: 20, another_field2: "Broken data" } const res1 = schema.validate(data1); const res2 = schema.validate(data2); const res3 = schema.validate(data3); console.log(res1.error) console.log(res2.error) console.log(res3.error)

的错误。 对于这种情况有什么解决方案吗,或者也许最好为

ValidationError: "another_field1" is not allowed { …(2) }
函数创建不同的架构?
    

javascript node.js schema joi
1个回答
0
投票

Parts

	
© www.soinside.com 2019 - 2024. All rights reserved.