Join嵌套架构

Joi Nested schema

本文关键字:嵌套 Join      更新时间:2023-09-26

我试图在joi中创建嵌套模式,但它抛出错误

[错误:对象架构不能是joi架构]

var nestedSchema = joi.object({
    b: joi.number()
});
var base = joi.object({
    a: joi.string(),
    nestedData:joi.object(nestedSchema)
});

我应该如何在joi中定义嵌套模式?

尽管Francesco的答案有效,但不需要使用object.keys()。问题创建者所做的错误是将模式作为参数传递给joi.object()

因此,创建嵌套模式就像将一个模式分配给属于另一个模式的键一样简单。

const schemaA = Joi.string()
const schemaB = Joi.object({ keyB1: schemaA, keyB2: Joi.number() })
const schemaC = Joi.object({
  keyC1: Joi.string(),
  keyC2: schemaB  
})
Joi.validate({ keyC1: 'joi', keyC2: { keyB1: 'rocks!', keyB2: 3 } }, schemaC)

您可以使用object.keys API

var nestedSchema = joi.object().keys({
    b: joi.number()
});
var base = joi.object({
    a: joi.string(),
    nestedData: nestedSchema
});

这只是一个基于Francesco公认答案的提示:

如果您需要"nestedData"是必需的->"base"中的"nestedData:nestedSchema.required()"将不起作用,您需要像任何其他参数一样直接在"nestedSchema"上设置它

    var nestedSchema = joi.object().keys({
        b: joi.number()
    })
    .required();
    var base = joi.object({
        a: joi.string(),
        nestedData: nestedSchema
    });

使用Join版本17.6.0,您可以使用如下所示的valid函数

const schema = Joi.object({
   type: Joi.string().valid('android', 'ios').insensitive()
})

如果类型属性不是androidios

,这将引发错误
const base = joi.object({
     a: joi.string(),
     nestedData: joi.object({b: joi.number()})
});