2016-06-22 9 views
3

Gibt es eine Möglichkeit, eine benutzerdefinierte Nachricht für JSON-Schema (tv4) für einen Fehler bei einem Feld oneOf festlegen?JSON-Schema benutzerdefinierte Nachricht für oneOf

Ich sah, dass ein Problem für benutzerdefinierte Nachrichten vor etwa einem Jahr here und here geöffnet wurde, aber gibt es eine Möglichkeit, dies für so etwas funktionieren zu lassen?

{ 
    "id": "code", 
    "description": "Schema for request.body - pin for logging into the bank", 
    "oneOf": [ 
     { 
      "type": "string", 
      "pattern": "^.*\\S.*$" 
     }, 
     { 
      "type": "object", 
      "properties": { 
       "type": { 
        "type": "string", 
        "pattern": "^(encrypted|not_encrypted)$" 
       }, 
       "value": { 
        "type": "string", 
        "pattern": "^.*\\S.*$" 
       } 
      } 
     } 
    ], 
    "messages": { 
     "oneOf": "Code does not match schema" 
    } 
} 

als nur Data does not match any schemas from \"oneOf\" Gegensatz zu sehen, konnte man sehen, Code does not match schema

[EDIT]

ich durch den tv4 Code lese, so gut wie ich kann und ich sehe viel über benutzerdefinierte Fehlermeldungen und Codes, z

defineError: function (codeName, codeNumber, defaultMessage) { 
    if (typeof codeName !== 'string' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) { 
     throw new Error('Code name must be a string in UPPER_CASE_WITH_UNDERSCORES'); 
    } 
    if (typeof codeNumber !== 'number' || codeNumber%1 !== 0 || codeNumber < 10000) { 
     throw new Error('Code number must be an integer > 10000'); 
    } 
    if (typeof ErrorCodes[codeName] !== 'undefined') { 
     throw new Error('Error already defined: ' + codeName + ' as ' + ErrorCodes[codeName]); 
    } 
    if (typeof ErrorCodeLookup[codeNumber] !== 'undefined') { 
     throw new Error('Error code already used: ' + ErrorCodeLookup[codeNumber] + ' as ' + codeNumber); 
    } 
    ErrorCodes[codeName] = codeNumber; 
    ErrorCodeLookup[codeNumber] = codeName; 
    ErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage; 
    for (var langCode in languages) { 
     var language = languages[langCode]; 
     if (language[codeName]) { 
      language[codeNumber] = language[codeNumber] || language[codeName]; 
     } 
    } 
}, 

Ich kann meine eigenen Fehler mit einer eigenen Statuscode (über diese Funktion) durch eine einfache Linie tv4.defineError('MY_CUSTOM_CODE_ERROR', 999999, "Hello World, you have a custom code error"); hinzufügen. Wie verknüpfe ich diesen Fehler mit diesem spezifischen JSON-Schema? Und wenn ich komplett am falschen Ort bin, dann zeigt jemand das auch bitte

+0

Abgesehen von der Tatsache, dass das Merkmal aus der Beschreibung fehlt, die [Fehler Reporter] (https://github.com/geraintluff/tv4/blob/master/source/error-reporter.js) scheint einfach die Nachricht aus einem [einfachen Wörterbuch] (https://github.com/geraintluff/tv4/blob /master/source/api.js#L136) (standardmäßig auf [englische Nachrichten] (https://github.com/geraintluff/tv4/blob/master/source/api.js#L42)). –

Antwort

1

Ich stolperte über Ihren Beitrag von GitHub, eine Lösung zum Hinzufügen von benutzerdefinierten Nachricht zu "AnyOf", "OneOf" -Klauseln zu finden. Hier ist, was für mich gearbeitet: Siehe here

tv4.setErrorReporter(function (error, data, schema) { 
// Last component of schemaPath, which *most* of the time is the keyword! 
var lsP = error.schemaPath.split('/').splice(-1); 
return schema.messages && schema.messages[lsP]; 
}); 

und Ihre Schema-Definition lautet wie folgt:

{ 
"id": "code", 
"description": "Schema for request.body - pin for logging into the bank", 
"oneOf": [ 
    { 
     "type": "string", 
     "pattern": "^.*\\S.*$" 
    }, 
    { 
     "type": "object", 
     "properties": { 
      "type": { 
       "type": "string", 
       "pattern": "^(encrypted|not_encrypted)$" 
      }, 
      "value": { 
       "type": "string", 
       "pattern": "^.*\\S.*$" 
      } 
     } 
    } 
], 
"messages": { 
    "oneOf": "Code does not match schema" 
} 
} 
Verwandte Themen