2017-03-20 9 views
3

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

スキーマ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() 
} 

マージされたスキーマ:それは簡単にObject.assignで行うのネストされたオブジェクトがなければ

{ 
    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(), 
} 

、それでも深いオブジェクトのマージはしませんネストされたオブジェクトは関数呼び出しであるため、ネストされたオブジェクトで作業します。

+2

concat() ']](https://github.com/hapijs/joi/blob/master/API.md#anyconcatschema) – Ankh

答えて

-2

JavascriptのObject.assign()を使用することができますが、あなたが探しているものは、Joiの.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); 

Joi.object()でそれらをラップする対ストレートJSオブジェクトを使用する方法についてinteresting noteもあります。

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

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

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

ですから、Ankh's提案を取り、まっすぐ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); 

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

1

プレーンなjavascriptオブジェクトを使用することは、私の選択肢ではありませんでした。私は.keysメソッドを使って拡張しようとしましたが、既存のキー(この場合はcharlie)を上書きします。

私は.reachを使用していたに落ち着いソリューション: 例:

const Joi = require('joi'); 
const originalSchema = Joi.object({ 
    a: { 
    deep: { 
     b: Joi.string() 
    }  
    }, 
    c: Joi.string() 
}); 
const extendedSchema = Joi.object({ 
    a: { 
    deep: Joi 
     .reach(originalSchema, 'a.deep') 
     .keys({ anotherB: Joi.string() }) 
    }, 
    c: Joi.reach(originalSchema, 'c') 
}); 

// No errors 
extendedSchema.validate({ a: { deep: { b: 'hi', anotherB: 'hi' } }, c: 'wow' }) 
あなたは `[Joi`の` Object.assign() ``の組み合わせを使用して、独自の関数を作成することが可能とあり
関連する問題