2017-07-15 71 views
3

我正在爲具有社交個人資料的某些字段的對象定義Joi模式。目標是確保所有字段都存在,並且至少其中一個字段是非空字符串,但允許其他字符串爲null要求joi對象中至少有一個允許null的非null子女

這是我到目前爲止有:

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

對象沒有幫助,因爲在使用min()or()

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

之處在於下列對象被認爲是有效的這個偉大的工程這些字段存在,它們只是錯誤的類型。

事後做一個額外的循環,檢查所有字段的具體情況是null,但這並不理想。

這是用於payload validation,在這裏很高興知道客戶端了解完整的模式,因此希望所有的字段都存在。也許這不值得。我確實知道我可以使用一些詳細的when()代碼來完成工作,但似乎在這一點上,我可能只是做出自己的循環。希望被證明是錯誤的!

回答

0

這裏是現成的答案:Using Joi, require one of two fields to be non empty

淳佳有.alternatives()method,有.try()方法中,你可以簡單地通過所有的選項 在每種情況下,你必須只保留一個required

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

所以,你不需要使用.min().or()

+0

嗨,謝謝你的幫助。不幸的是,這並沒有驗證所有字段都存在。因此,像{{facebook:'foo'}}這樣的對象成功驗證,我想要輸入的地方是{Facebook:'foo',twitter:null,youtube:null}'。 –

+0

@SethHolladay 你能給我至少一三個有效和無效的例子嗎? – IlnurIbat

+0

當然!我做了一個回購測試@IlnurIbat請參閱https://github.com/sholladay/repro-so-45123536 –