2015-11-18 16 views
8

Ho il seguente convalida su uno dei miei percorsi:convalida Hapi/Joi con oggetto nidificato

payload: { 
    keywordGroups: Joi.array().items(Joi.object().keys({ 
     language: Joi.string().required(), 
     containsAny: Joi.array().items(Joi.string()).default([]).when('containsAll', { is: [], then: Joi.required() }), 
     containsAll: Joi.array().items(Joi.string()).default([]).when('containsAny', { is: [], then: Joi.required() }), 
     notContainsAll: Joi.array().items(Joi.string()).default([]), 
     notContainsAny: Joi.array().items(Joi.string()).default([]) 
    })).required(), 
} 

che sto cercando di fare in modo che containsAny o containsAll devono includere almeno una stringa. Se containsAny è vuoto, containsAll dovrebbe avere almeno un elemento. E se containsAll è vuoto, containsAny dovrebbe includere almeno un elemento.

Ma sembra che lo Joi.when non funzioni davvero quando si tratta di una matrice di oggetti.

+0

Prova a scambiare il tuo è: [] per Joi.array(). Length (0). la documentazione suggerisce che la condizione sia dovrebbe essere di tipo Joi. https://github.com/hapijs/joi/blob/master/API.md#anywhenref-options – Cuthbert

+0

Penso che stai creando anche una dipendenza circolare qui. vedi questa discussione: https://github.com/hapijs/joi/issues/588 – Cuthbert

+0

@Cuthbert Penso che la mia domanda principale fosse su come potrei fare riferimento a quei campi correttamente, vedendo che si trovano in una serie di oggetti. –

risposta

5

È necessario utilizzare Joi.alternatives() altrimenti si creerà una dipendenza circolare come descritto in this issue.

Nella condizione is nello when(), è necessario specificare un tipo Joi anziché solo un array vuoto. Questo esempio funziona:

import * as Joi from 'joi'; 

var arraySchema = Joi.array().items(Joi.object().keys({ 
    first: Joi.array().items(Joi.number()).default([]) 
     .when('second', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}), 
    second: Joi.array().items(Joi.number()).default([]) 
})); 

var altArraySchema = Joi.array().items(Joi.object().keys({ 
    first: Joi.array().items(Joi.number()).default([]), 
    second: Joi.array().items(Joi.number()).default([]) 
     .when('first', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}), 
})); 

var obj = [ 
    { 
     first: [], 
     second: [] 
    } 
]; 

var finalSchema = Joi.alternatives(arraySchema, altArraySchema); 

var result = Joi.validate(obj, finalSchema); 

console.log(JSON.stringify(result, null, 2)); 

La variabile obj fallirà convalida perché sia ​​first e second sono vuoti. L'esecuzione di uno di essi non vuoto supererà il controllo di convalida.

Problemi correlati