2015-11-18 12 views
8

Ich habe folgende Validierung auf einem meiner TourenHapi/Joi Validierung mit verschachteltem Objekt

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(), 
} 

Ich versuche, es zu machen, so dass containsAny oder containsAll mindestens eine Saite aufzunehmen. Wenn containsAny leer ist, sollte containsAll mindestens ein Element haben. Und wenn containsAll leer ist, sollte containsAny mindestens ein Element enthalten.

Aber es scheint, Joi.when funktioniert nicht wirklich, wenn es um eine Reihe von Objekten kommt.

+0

Versuchen Sie, Ihre ist: [] für Joi.array(). Länge (0). Die Dokumentation schlägt vor, dass die is-Bedingung ein Joi-Typ sein sollte. https://github.com/hapijs/joi/blob/master/API.md#anywhenref-options – Cuthbert

+0

Ich denke, Sie erstellen hier auch eine zirkuläre Abhängigkeit. Sehen Sie sich diesen Thread an: https://github.com/hapijs/joi/issues/588 – Cuthbert

+0

@Cuthbert Ich denke, meine Hauptfrage war, wie ich diese Felder korrekt referenzieren könnte, da sie sich in einer Reihe von Objekten befinden. –

Antwort

5

Sie müssen Joi.alternatives() verwenden, andernfalls erstellen Sie eine zirkuläre Abhängigkeit wie in this issue beschrieben. In Ihrer is-Bedingung in der when() müssen Sie einen Joi-Typ statt nur ein leeres Array angeben. Dieses Beispiel funktioniert:

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)); 

Die Variable obj wird die Validierung fehl, da beide first und second leer sind. Wenn Sie beide nicht leer lassen, wird die Validierungsprüfung bestanden.

Verwandte Themen