2015-03-04 16 views
8

Se ho due campi, vorrei solo verificare quando almeno un campo è una stringa non vuota, ma fallire quando entrambi i campi sono stringhe vuote.Utilizzando Joi, è necessario che uno dei due campi non sia vuoto

Qualcosa di simile non convalida

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

Quando convalida contro

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

Il or condizione solo test per la presenza di una chiave a o b, ma fa verificare se la condizione per a o b è vero. Joi.string() non riuscirà per le stringhe vuote.

Ecco succo con alcuni casi di test per dimostrare

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

risposta

12

Codice di seguito ha lavorato per me. Ho usato delle alternative perché. O sta davvero testando l'esistenza delle chiavi e quello che volevi davvero era un'alternativa in cui avresti permesso che una chiave o l'altra fossero vuote.

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

Grazie @ Kevin-wu che funziona per me :) – Brendan

+7

Questo funziona, ma in realtà non è scalabile - se aveste due insiemi di questi, avreste bisogno di quattro alternative, se si dispone di tre serie di questi allora avresti bisogno di otto. Non sembra che ci sia un modo migliore però. –