2017-07-15 17 views
3

ソーシャルプロファイルのフィールドがいくつかあるオブジェクトに対してJoiスキーマを定義しています。目的は、すべてのフィールドが存在し、少なくとも1つが空ではない文字列であることを保証することですが、他のフィールドはnullにすることができます。ここでnullを許可するjoiオブジェクトにNULL以外の子を少なくとも1つ必要とする

は、私がこれまで持っているものです。

const socialUrl = joi.string().min(1).alphanum().allow(null); 
const schema = joi.object({ 
    facebook : socialUrl.required(), 
    twitter : socialUrl.required(), 
    youtube : socialUrl.required() 
}).required() 

これは、次のオブジェクトが有効であると考えられることを除いて素晴らしい作品:

{ 
    facebook : null, 
    twitter : null, 
    youtube : null 
} 

オブジェクトにmin()or()を使用するためには役立ちません。フィールドが存在する、彼らは間違ったタイプです。

後で自分自身で余分なループを行い、すべてのフィールドの具体的なケースがnullであることを確認するのはかなり簡単ですが、それは理想的ではありません。

これはpayload validationで使用されています。クライアントが完全なスキーマを理解していることがわかり、したがってすべてのフィールドが存在することが望ましいということがわかります。多分それはそれに値するものではありません。私は仕事を終わらせるためにいくつか冗長なコードwhen()を使うことができるという感覚を得るが、それは私自身のループを作っているように思えるかもしれない。間違ったことが証明されることを願っています!ここ

答えて

0

の準備ができて答えです:Using Joi, require one of two fields to be non empty

JOIは、あなたは、単にそれぞれの場合には、すべてのオプション を通過する可能性があった.try()方法を持っているあなたは

const socialUrl = joi.string().min(1).alphanum().allow(null); 

const schema = joi.alternatives().try(
    joi.object({ 
    facebook: socialUrl.required(), 
    twitter: socialUrl, 
    youtube: socialUrl, 
    }), 
    joi.object({ 
    facebook: socialUrl, 
    twitter: socialUrl.required(), 
    youtube: socialUrl, 
    }), 
    joi.object({ 
    facebook: socialUrl, 
    twitter: socialUrl, 
    youtube: socialUrl.required(), 
    }), 
); 
一つだけ requiredフィールドを維持しなければならない .alternatives() methodを、持っています

だから、あなたは使用する必要はありません.min()または.or()

+0

こんにちは、助けてくれてありがとう。残念ながら、これはすべてのフィールドが存在することを検証しません。だから、 '{facebook: 'foo'}'のようなオブジェクトは、 '{facebook: 'foo'、twitter:null、youtube:null}'の入力を要求したいところです。 –

+0

@SethHolladay 少なくとも3つの有効で無効な例を教えてください。 – IlnurIbat

+0

私はテストを使ってレポを作った@IlnurIbat https://github.com/sholladay/repro-so-45123536を参照 –

関連する問題