Пользовательское сообщение схемы JSON для oneOf
Есть ли способ установить пользовательское сообщение для схемы JSON (TV4), когда оно не удается в oneOf
поле?
Я видел, что была проблема, открытая для пользовательских сообщений около года назад здесь и здесь, но есть ли способ заставить эту работу что-то вроде этого?
{
"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"
}
}
в отличие от просто видеть Data does not match any schemas from \"oneOf\"
, вы могли видеть Code does not match schema
[РЕДАКТИРОВАТЬ]
Я читаю код tv4 настолько хорошо, насколько могу, и вижу много о пользовательских сообщениях об ошибках и кодах, например
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];
}
}
},
Я могу добавить свою ошибку с помощью собственного кода состояния (с помощью этой функции) одной простой строкой tv4.defineError('MY_CUSTOM_CODE_ERROR', 999999, "Hello World, you have a custom code error");
, Как связать эту ошибку с этой конкретной схемой JSON? И если я совершенно не в том месте, тогда кто-нибудь также укажет на это, пожалуйста
1 ответ
Я наткнулся на ваше сообщение от GitHub, пытаясь найти решение для добавления пользовательского сообщения в предложения "anyOf", "oneOf". Вот что сработало для меня: смотрите здесь
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];
});
и ваше определение схемы выглядит так:
{
"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"
}
}