2015-03-04 9 views
8

Wenn ich zwei Felder habe, möchte ich nur überprüfen, wenn mindestens ein Feld eine nicht leere Zeichenfolge ist, aber fehlschlagen, wenn beide Felder leere Zeichenfolgen sind.Verwenden Sie Joi, erfordern eines der beiden Felder nicht leer

So etwas wie dies nicht überprüft

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

Wenn die Validierung gegen

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

Die or Zustand nur Tests auf das Vorhandensein von entweder Schlüssel a oder b, aber tut Test, ob die Bedingung für a oder b ist wahr. Joi.string() wird für leere Zeichenfolgen fehlschlagen.

Hier ist Kern mit einigen Testfälle

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

Antwort

12

-Code unten für mich zu zeigen, gearbeitet. Ich habe Alternativen verwendet, weil .oder wirklich nach der Existenz von Schlüsseln sucht und was Sie wirklich wollten, war eine Alternative, bei der Sie zulassen würden, dass der eine oder der andere Schlüssel leer ist.

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

Thanks @ kevin-wu, das funktioniert für mich :) – Brendan

+7

Dies funktioniert, ist aber nicht wirklich skalierbar - wenn Sie zwei Sätze von ihnen hatten Sie vier Alternativen benötigen würden, wenn Sie drei Satz Dann brauchst du acht. Es scheint jedoch keinen besseren Weg zu geben. –