Joi 嵌套模式和默认值

Tho*_*mas 3 javascript joi

我试图让 Joi 在另一个引用的辅助模式上强制执行默认值。我有两个像这样的模式:

const schemaA = Joi.object().keys({
  title: Joi.string().default(''),
  time: Joi.number().min(1).default(5000)
})

const schemaB = Joi.object().keys({
  enabled: Joi.bool().default(false),
  a: schemaA
})
Run Code Online (Sandbox Code Playgroud)

我想要的是提供一个a未定义的对象,并让 Joi 为其应用默认值,如下所示:

const input = {enabled: true}

const {value} = schemaB.validate(input)

//Expect value to equal this:
const expected = {
  enabled: true,
  a: {
    title: '',
    time: 5000
  }
}
Run Code Online (Sandbox Code Playgroud)

问题在于,由于密钥是可选的,因此根本没有强制执行。所以我想要的是它是可选的,但schemaA如果不存在则正确填充默认值。我一直在查看文档,但似乎无法找到任何关于此的信息,尽管我可能遗漏了一些明显的内容。有小费吗?

Vik*_*hee 7

更新:2020 年 4 月。

现在,您可以default()在嵌套对象中使用。这是带有测试的repo 中提交

var schema = Joi.object({
                a: Joi.number().default(42),
                b: Joi.object({
                    c: Joi.boolean().default(true),
                    d: Joi.string()
                }).default()
            }).default();
Run Code Online (Sandbox Code Playgroud)


ner*_*ger 6

这应该这样做:

const schemaA = Joi.object().keys({
  title: Joi.string().default(''),
  time: Joi.number().min(1).default(5000),
});

const schemaB = Joi.object().keys({
  enabled: Joi.bool().default(false),
  a: schemaA.default(schemaA.validate({}).value),
});
Run Code Online (Sandbox Code Playgroud)

虽然如果他们实现一个功能让我们Joi为默认值传递模式对象会更好,就像这样:schemaA.default(schemaA)schemaA.default('object')