Мы создаем внешний проект для веб-приложения, которое общается с бэкэнд, написанным другой командой. Некоторые из разработчиков работают над обоими проектами и лучше понимают изменения в области бэкэнд и ответных полей.
Недавно у нас были части интерфейса, так как они вносили изменения в части приложения, основанные на изменениях в бэкэнд, не обновляя логику во всех местах. Чтобы смягчить это, я хочу создать концепцию маски/шаблона, в которой будут обрабатываться все данные ответа. Таким образом, остальные члены команды, которые не знакомы с бэкэнд, могут заметить/устранить эти ошибки.
Для этого я рассматриваю использование схемы JSON. Однако вместо простой проверки я хочу проанализировать с ней внутренние данные (удаление полей, отсутствующих в схеме). Таким образом, разработчик, внесший изменения в интерфейсе в ответ на изменение бэкэнд, также должен будет обновить этот шаблон, тем самым вызывая потерю теста до тех пор, пока не будет обновлена вся логика с использованием этой схемы (а не только логика, к которой он коснулся). Я играю с https://www.npmjs.com/package/jsonschema, но у него, похоже, нет способа удалить лишние поля, просто проверьте их.
В JSON Schema, можно также установить additionalProperties
флаг. Однако у него есть две проблемы:
Возможно, валидатор не подходит для этого, но все, что я нахожу при поиске парсеров схемы JSON. Может ли кто-нибудь вести меня в правильном направлении, чтобы я не изобретал велосипед? Похоже, что эта функциональность очень похожа на то, что уже делает валидатор, и я предпочел бы эту обработку в одном и том же проходе.
Найден валидатор, который делает то, что я хочу: https://github.com/acornejo/jjv. У меня есть removalAdditional
который я могу установить, вот быстрый тест, который я сделал:
var jjv = require('jjv')();
var addressSchema = {
"id": "address",
"type": "object",
"properties": {
"lines": {
"type": "array",
"items": {"type": "string"}
},
"zip": {"type": "string"},
"city": {"type": "string"},
"country": {"type": "string"}
},
"required": ["country"]
};
var schema = {
"id": "person",
"type": "object",
"properties": {
"name": {"type": "string"},
"address": {"$ref": "address"},
"votes": {"type": "integer", "minimum": 1}
}
};
var p = {
"name": "Barack Obama",
"address": {
"lines": [ "1600 Pennsylvania Avenue Northwest" ],
"zip": "DC 20500",
"city": "Washington",
"foobar": "baz",
"country": "USA"
},
"a": {
"b": 1,
"c": 2
},
"votes": "lots",
"stuff": "yes"
};
jjv.addSchema('address', addressSchema);
jjv.addSchema('schema', schema);
jjv.defaultOptions.checkRequired = true;
jjv.defaultOptions.removeAdditional = true;
console.log(jjv.validate('schema', p));
console.log(p);
И ответ:
{ validation: { votes: { type: 'integer' } } }
{ name: 'Barack Obama',
address:
{ lines: [ '1600 Pennsylvania Avenue Northwest' ],
zip: 'DC 20500',
city: 'Washington',
country: 'USA' },
votes: 'lots' }