2016-05-18 7 views
2

を検証:これを実行するとき攘夷私はこのようなネストされたスキーマを設定しているネストされたスキーマの個々のフィールド

var schema = Joi.object().keys({ 
    first_name: Joi.string().required(), 
    last_name: Joi.string().required(), 
    address: Joi.object().keys({ 
    street: Joi.string().required(), 
    zip: Joi.number().required(), 
    state: Joi.string().required(), 
    country: Joi.string().required() 
    }).required(), 
}) 

var options = { abortEarly: false }; 

var result = Joi.validate({}, schema, options); 

result.errorは、メッセージを返します。展開されません。私は、アドレスフィールド全体が欠落しているというメッセージを受け取ることは望まない。代わりに、アドレススキーマが欠落している個々のアイテムについて通知を受けたいと思います。 addressを明示的に要求しないと、そのアイテムはrequired()に対してまったく有効ではありません。ネストされたフィールドの検証は、スキーマレベル内の個々のアイテムではなく、ネストされたスキーマオブジェクトレベル全体でのみ機能するように見えます。個々のネストされたスキーマ項目を使用するにはどうすればよいですか?

+1

は、あなたがこの問題を解決できましたか? –

答えて

0

「スケルトン」オブジェクトを追加すると機能します。 作業例here

import Joi, { 
    string, 
    number, 
    object 
} from "joi"; 

var schema = object({ 
    first_name: string().required(), 
    last_name: string().required(), 
    address: object({ 
    street: string().required(), 
    zip: number().required(), 
    state: string().required(), 
    country: string().required() 
    })/*.required(), <= Not needed */ 
}) 
var skeleton = { address: {} }; 

var options = { abortEarly: false }; 

var validate = data => { 
    var newData = Object.assign({}, skeleton, data); 
    return Joi.validate(newData, schema, options); 
} 
console.log(
    JSON.stringify(validate({}).error.details, null, 2) 
); 

結果:

[ 
    { 
    "message": "\"first_name\" is required", 
    "path": "first_name", 
    "type": "any.required", 
    "context": { 
     "key": "first_name" 
    } 
    }, 
    { 
    "message": "\"last_name\" is required", 
    "path": "last_name", 
    "type": "any.required", 
    "context": { 
     "key": "last_name" 
    } 
    }, 
    { 
    "message": "\"street\" is required", 
    "path": "address.street", 
    "type": "any.required", 
    "context": { 
     "key": "street" 
    } 
    }, 
    { 
    "message": "\"zip\" is required", 
    "path": "address.zip", 
    "type": "any.required", 
    "context": { 
     "key": "zip" 
    } 
    }, 
    { 
    "message": "\"state\" is required", 
    "path": "address.state", 
    "type": "any.required", 
    "context": { 
     "key": "state" 
    } 
    }, 
    { 
    "message": "\"country\" is required", 
    "path": "address.country", 
    "type": "any.required", 
    "context": { 
     "key": "country" 
    } 
    } 
] 
関連する問題