web-dev-qa-db-ja.com

Joiネストスキーマ

Joiでネストされたスキーマを作成しようとしていますが、エラーがスローされます

[エラー:オブジェクトスキーマをjoiスキーマにすることはできません]

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

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

Joiでネストされたスキーマを定義するにはどうすればよいですか?

21
Anshul

object.keys APIを使用できます

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

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

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)
20
Túbal Martín

フランチェスコの承認された回答に基づくヒント:

「nestedData」が必要な場合->「base」の「nestedData:nestedSchema.required()」は機能しません。他のパラメータと同様に、「nestedSchema」に直接設定する必要があります

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

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