2017-03-30 3 views
1

Ich bin auf ein Problem (oder was ich glaube, dass eine) mit Joi Validierung. Ich versuche, einem nicht vorhandenen Schlüssel einen Wert zuzuweisen, wenn dieser als Teil des Anfragetexts übergeben wurde.Joi-Validierung Standard als leeres Objekt

So zum Beispiel:

parameters: Joi.object().keys({ 
    keyA: Joi.string().allow('').allow(null).default(null), 
    keyB: Joi.object().keys({ 
    b1: Joi.string(), 
    b2: Joi.string(), 
    b3: Joi.object().keys({ 
     b3_1: Joi.string(), 
     b3_2: Joi.string(), 
     b3_3: Joi.string() 
    }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
    c1: Joi.number(), 
    c2: Joi.number(), 
    c3: Joi.boolean(), 
    c4: Joi.boolean() 
    }).default({}), 
    keyD: Joi.object().keys({ 
    d1: Joi.number(), 
    d2: Joi.number() 
    }).default({}), 
    keyE: Joi.object().keys({ 
    e1: Joi.number() 
    }).default({}) 
}).allow(null) 

So spezifisch zu sein, wenn ich in passieren waren: Augen:

{ 
    keyA: "foo", 
    keyD: { 
    d1: 21.9, 
    d2: 21.1 
    }, 
    keyE: { 
    e1: 42 
    } 
} 

würde ich dieses

{ 
    keyA: "foo", 
    keyB: {}, 
    keyC: {}, 
    keyD: { 
    d1: 21.9, 
    d2: 21.1 
    }, 
    keyE: { 
    e1: 42 
    } 
} 

Mit im Gegenzug: auf die leeren Objekte. Was fehlt mir bei der Joi.default() Methode? Übertreibe ich, wofür Joi bestimmt ist?

+0

Beachten Sie, dass ich keine Validierungsfehler sehe - ich bekomme einfach nicht das gewünschte Ergebnis – bneigher

Antwort

1

ich mit dem Hinweis beginnen werde, dass das Schema in Ihrer Frage nicht gültig JavaScript ist, können Sie ein paar zu viele geschlossen haben Klammern vor dem Erklären der Regel für keyC. Ich nehme an, das ist einfach ein Formatierungsfehler mit der Frage und Ihr aktuelles Schema ist derzeit gültig.

Zweitens, es ist nichts falsch daran, wie Sie Ihre Standardwerte deklariert haben .. es funktioniert gut. Ich nehme an, es ist die Art, wie Sie das Schema, das das Problem ist, validieren.

Versuchen Sie, dies auszuführen. Ich habe die Validierungsmethode in the docs for default() nachgeahmt.

const schema = Joi.object().keys({ 
    keyA: Joi.string().allow('').allow(null).default(null), 
    keyB: Joi.object().keys({ 
     b1: Joi.string(), 
     b2: Joi.string(), 
     b3: Joi.object().keys({ 
      b3_1: Joi.string(), 
      b3_2: Joi.string(), 
      b3_3: Joi.string() 
     }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
     c1: Joi.number(), 
     c2: Joi.number(), 
     c3: Joi.boolean(), 
     c4: Joi.boolean() 
    }).default({}), 
    keyD: Joi.object().keys({ 
     d1: Joi.number(), 
     d2: Joi.number() 
    }).default({}), 
    keyE: Joi.object().keys({ 
     e1: Joi.number() 
    }).default({}) 
}).allow(null); 

Joi.validate({ 
    keyA: "foo", 
    keyD: { 
     d1: 21.9, 
     d2: 21.1 
    }, 
    keyE: { 
     e1: 42 
    } 
}, schema, (err, value) => 
{ 
    if (err) 
     throw err; 

    console.log(value); 
}); 

ich dies in der Konsole:

{ 
    keyA :'foo', 
    keyD: { 
     d1: 21.9, 
     d2: 21.1 
    }, 
    keyE: { 
     e1: 42 
    }, 
    keyB: {}, 
    keyC: {} 
} 

Die Schlüssel unwahrscheinlich sind wie Ihre erwartete Ausgabe aussehen bestellt, aber das sollte als object keys are not ordered ohnehin keine Rolle.

+0

Ja, Sie sind richtig - das Problem endete in einer äußeren Bibliothek, die leere Objekte entfernte. – bneigher

-1

Sie die Standardwerte einstellen können, sollten Sie dies versuchen:

parameters: Joi.object().keys({ 
    keyA: Joi.string().allow(null).default(null), 
    keyB: Joi.object().keys({ 
    b1: Joi.string().default("abc"), 
     b2: Joi.string().default("abc"), 
     b3: Joi.object().keys({ 
     b3_1: Joi.string().default("abc"), 
     b3_2: Joi.string().default("abc"), 
     b3_3: Joi.string().default("abc") 
     }) 
    }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
    c1: Joi.number().default(0), 
    c2: Joi.number().default(0), 
    c3: Joi.boolean().default(0), 
    c4: Joi.boolean().default(0) 
    }).default({}), 
    keyD: Joi.object().keys({ 
    d1: Joi.number().default(0), 
    d2: Joi.number().default(0) 
    }).default({}), 
    keyE: Joi.object().keys({ 
    e1: Joi.number().default(0) 
    }).default({}) 
}).allow(null) 
+0

Vielen Dank für Ihre Rückmeldung! Ziel ist es, die Standardwerte der Objekte als leere Objekte festzulegen. Ich bin nicht besorgt über die Werte der Objektschlüssel - sie sind nur da, um mein Beispiel zu zeigen – bneigher

+0

Es scheint, als ob Joi.object(). Default() nicht respektiert wird – bneigher