16

2 つの joi スキーマを 1 つのスキーマにマージする方法はありますか?

スキーマ 1

{
  alpha: Joi.number().required(),
  beta: Joi.string().required(),
  chalie: Joi.object({
    xray: Joi.number().required(),
  }).required()
}

スキーマ 1

{
  delta: Joi.string().required(),
  echo: Joi.number().required(),
  charlie: Joi.object({
    zulu: Joi.string().required(),
  }).required()
}

マージされたスキーマ:

{
  alpha: Joi.number().required(),
  beta: Joi.string().required(),
  chalie: Joi.object({
    xray: Joi.number().required(),
    zulu: Joi.string().required(),
  }).required()
  delta: Joi.string().required(),
  echo: Joi.number().required(),
}

ネストされたオブジェクトがなければ、 で簡単に実行できObject.assignますが、ネストされたオブジェクトは関数呼び出しであるため、深いオブジェクト マージでさえネストされたオブジェクトでは機能しません。

4

8 に答える 8

-1

Javascript の を使用できますが、探しているのは Joi の 機能Object.assign()だと思います。.keys()

あなたのコードでは、次のようにします。

const schema1 = Joi.object({
  alpha: Joi.number().required(),
  beta: Joi.string().required(),
  charlie: Joi.object({
    xray: Joi.number().required(),
  }).required()
});

const schema2 = Joi.object({
  delta: Joi.string().required(),
  echo: Joi.number().required(),
  charlie: Joi.object({
    zulu: Joi.string().required(),
  }).required()
});

const mergedSchema = schema1.keys(schema2);

ストレートな JS オブジェクトを使用することと、それらをラップすることについての興味深いメモもありJoi.object()ます。

{} 表記を使用する場合は、スキーマ オブジェクトではない単純な JS オブジェクトを定義しているだけです。検証メソッドに渡すことはできますが、オブジェクトの validate() メソッドを呼び出すことはできません。これは単なる JS オブジェクトであるためです。

また、毎回 {} オブジェクトを validate() メソッドに渡すと、検証のたびにコストのかかるスキーマ コンパイル操作が実行されます。

Joi.object([schema]) を使用すると、最初にコンパイルされるため、validate() メソッドに複数回渡すことができ、オーバーヘッドは追加されません。

したがって、Ankh の提案を取り入れて、まっすぐな JS オブジェクトを使用できます。

const schema1 = {
  alpha: Joi.number().required(),
  beta: Joi.string().required(),
  charlie: Joi.object({
    xray: Joi.number().required(),
  }).required()
};

const schema2 ={
  delta: Joi.string().required(),
  echo: Joi.number().required(),
  charlie: Joi.object({
    zulu: Joi.string().required(),
  }).required()
};

const mergedSchema = Object.assign({}, schema1, schema2);

ただし、関連するパフォーマンスのペナルティがあります。

于 2017-05-31T19:33:07.323 に答える