2015-03-04 8 views
8

यदि मेरे पास दो फ़ील्ड हैं, तो मैं केवल तब सत्यापित करना चाहूंगा जब कम से कम एक फ़ील्ड एक खाली खाली स्ट्रिंग हो, लेकिन विफल हो जब दोनों फ़ील्ड खाली स्ट्रिंग हों।जोई का उपयोग करके, दो फ़ील्ड में से एक को रिक्त होने की आवश्यकता नहीं है

इस तरह कुछ

var schema = Joi.object().keys({ 
    a: Joi.string(), 
    b: Joi.string() 
}).or('a', 'b'); 

को मान्य नहीं करता जब या तो कुंजी a या b की उपस्थिति के लिए

{a: 'aa', b: ''} 

or हालत केवल परीक्षण के खिलाफ मान्य है, लेकिन है कि क्या a के लिए शर्त परीक्षण करता है या b सच है। Joi.string() खाली तारों के लिए असफल हो जाएगा।

यहाँ प्रदर्शित करने के लिए

नीचे

http://requirebin.com/?gist=84c49d8b81025ce68cfb

उत्तर

12

कोड मेरे लिए काम किया कुछ परीक्षण मामलों के साथ सार है। मैंने विकल्पों का उपयोग किया क्योंकि। या वास्तव में चाबियों के अस्तित्व के लिए परीक्षण कर रहा है और जो आप वास्तव में चाहते थे वह एक विकल्प था जहां आप एक कुंजी या दूसरे को खाली होने की अनुमति देंगे।

var console = require("consoleit"); 
var Joi = require('joi'); 

var schema = Joi.alternatives().try(
    Joi.object().keys({ 
    a: Joi.string().allow(''), 
    b: Joi.string() 
    }), 
    Joi.object().keys({ 
    a: Joi.string(), 
    b: Joi.string().allow('') 
    }) 
); 

var tests = [ 
    // both empty - should fail 
    {a: '', b: ''}, 
    // one not empty - should pass but is FAILING 
    {a: 'aa', b: ''}, 
    // both not empty - should pass 
    {a: 'aa', b: 'bb'}, 
    // one not empty, other key missing - should pass 
    {a: 'aa'} 
]; 

for(var i = 0; i < tests.length; i++) { 
    console.log(i, Joi.validate(tests[i], schema)['error']); 
} 
+0

धन्यवाद @ केविन-वू कि मेरे लिए काम करता :) – Brendan

+7

यह काम करता है, लेकिन वास्तव में स्केलेबल नहीं है - अगर आप इन के दो सेट था, तो आप, चार विकल्प आवश्यकता होगी आप के तीन सेट है, तो तब आपको आठ की आवश्यकता होगी। ऐसा नहीं लगता है कि हालांकि एक बेहतर तरीका है। –

संबंधित मुद्दे