Joi 嵌套模式

Posted

技术标签:

【中文标题】Joi 嵌套模式【英文标题】:Joi Nested schema 【发布时间】:2016-08-12 20:58:06 【问题描述】:

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

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

var nestedSchema = joi.object(
    b: joi.number()
);

var base = joi.object(
    a: joi.string(),
    nestedData:joi.object(nestedSchema)
);

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

【问题讨论】:

【参考方案1】:

你可以使用object.keys API

var nestedSchema = joi.object().keys(
    b: joi.number()
);

var base = joi.object(
    a: joi.string(),
    nestedData: nestedSchema
);

【讨论】:

谢谢...但是有一个错字。它应该是 joi.object().keys 而不是 joi.object.keys【参考方案2】:

虽然 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)

【讨论】:

使用这种方法你会如何要求keyB1:【参考方案3】:

只是基于 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
    );

【讨论】:

以上是关于Joi 嵌套模式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌套字典列表展平熊猫数据框中的列

mysql join底层原理

Mongoose 嵌套模式与嵌套模型

嵌套 Avro 模式

RAML:嵌套模式

如何使用 'type' 在 mongoose 中使用嵌套模式来创建数组?