2015-03-04 26 views
8

İki alanım varsa, en az bir alanın boş olmayan bir dize olduğunu doğrulamak isterim, ancak her iki alan boş dizeler olduğunda başarısız olur.Joi'yi kullanarak boş olmayan iki alandan birini gerektirir

Böyle bir şey anahtar a veya b ya varlığı için

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

or durum sadece testler karşı doğrularken

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

doğrulamak ancak a için koşul olup testi yapar etmez veya b doğrudur. Joi.string() boş dizeler için başarısız olur. İşte

aşağıda

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

cevap

12

Kod benim için çalıştı göstermek için bazı test durumlarda ile özü buydu. Alternatifler kullandım çünkü .or gerçekten anahtarların varlığını test ediyor ve gerçekten istediğin şey bir anahtarın veya diğerinin boş olmasına izin verebileceğin bir alternatifti. benim için çalışıyor

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

Teşekkür @ Kevin-wu :) – Brendan

+7

Bu çalışır, ancak gerçekten ölçeklenebilir değildir - bu iki takım olsaydı, sen dört alternatifleri ihtiyacım olacağını size üç set varsa Bunlar sonra sekiz tane lazım. Yine de daha iyi bir yol olduğu görünmüyor. –

İlgili konular