Переход на xml2js вместо js2xmlparser для сбора XML, корректная однозначная конвертация массивов в выходном JSON (проблема - когда один элемент получался объект, а не массив, что давало разный по структуре ответ)
This commit is contained in:
parent
5ba92d898b
commit
857db44faf
@ -6,15 +6,15 @@
|
|||||||
//----------------------
|
//----------------------
|
||||||
// Подключение библиотек
|
// Подключение библиотек
|
||||||
//----------------------
|
//----------------------
|
||||||
const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON
|
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
|
||||||
const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML
|
const _ = require("lodash"); //Работа с коллекциями и объектами
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
// Глобальные константы
|
// Глобальные константы
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
//Наименования XML-элементов
|
//Наименования специальных управляющих атрибутов XML
|
||||||
const SREQUEST_ROOT = "XREQUEST"; //Корневой элемент XML-представления входящего запроса
|
const SJSON_CONTROL_ATTR_ARRAY = "___array___"; //Управляющий атрибут для указания параметров конвертации массива
|
||||||
|
|
||||||
//Поля заголовка сообщения
|
//Поля заголовка сообщения
|
||||||
const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "content-type" для JSON
|
const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "content-type" для JSON
|
||||||
@ -26,23 +26,52 @@ const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "conten
|
|||||||
//Разбор XML
|
//Разбор XML
|
||||||
const parseXML = xmlDoc => {
|
const parseXML = xmlDoc => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
xmlParser(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => {
|
xml2js.parseString(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => {
|
||||||
if (err) reject(err);
|
if (err) reject(err);
|
||||||
else resolve(result);
|
else resolve(result);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Дополнительная конвертация выходного JSON - корректное преобразование массивов
|
||||||
|
const converXMLArraysToJSON = (obj, arrayKey) => {
|
||||||
|
for (key in obj) {
|
||||||
|
if (obj[key][arrayKey]) {
|
||||||
|
let tmp = [];
|
||||||
|
let itemKey = obj[key][arrayKey];
|
||||||
|
if (obj[key][itemKey]) {
|
||||||
|
if (_.isArray(obj[key][itemKey])) {
|
||||||
|
for (let i = 0; i < obj[key][itemKey].length; i++) {
|
||||||
|
let buf = {};
|
||||||
|
buf[itemKey] = _.cloneDeep(obj[key][itemKey][i]);
|
||||||
|
tmp.push(buf);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let buf = {};
|
||||||
|
buf[itemKey] = _.cloneDeep(obj[key][itemKey]);
|
||||||
|
tmp.push(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
obj[key] = tmp;
|
||||||
|
converXMLArraysToJSON(obj[key], arrayKey);
|
||||||
|
} else {
|
||||||
|
if (_.isObject(obj[key])) converXMLArraysToJSON(obj[key], arrayKey);
|
||||||
|
if (_.isArray(obj[key]))
|
||||||
|
for (let i = 0; i < obj[key].length; i++) converXMLArraysToJSON(obj[key][i], arrayKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//Обработчик "До" для полученного сообщения
|
//Обработчик "До" для полученного сообщения
|
||||||
const before = async prms => {
|
const before = async prms => {
|
||||||
//Если пришел запрос в JSON
|
//Если пришел запрос в JSON
|
||||||
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
|
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
|
||||||
//Конвертируем полученный в JSON-запрос в XML, понятный серверной части
|
//Конвертируем полученный в JSON-запрос в XML, понятный серверной части
|
||||||
let request = {};
|
|
||||||
let requestXML = "";
|
let requestXML = "";
|
||||||
try {
|
try {
|
||||||
request = JSON.parse(prms.queue.blMsg.toString());
|
let request = JSON.parse(prms.queue.blMsg.toString());
|
||||||
requestXML = js2xmlparser.parse(SREQUEST_ROOT, request[SREQUEST_ROOT]);
|
let builder = new xml2js.Builder();
|
||||||
|
requestXML = builder.buildObject(request);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
requestXML = "";
|
requestXML = "";
|
||||||
}
|
}
|
||||||
@ -59,6 +88,8 @@ const after = async prms => {
|
|||||||
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
|
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
|
||||||
//Конвертируем ответ, подготовленный сервером, в JSON
|
//Конвертируем ответ, подготовленный сервером, в JSON
|
||||||
parseRes = await parseXML(prms.queue.blResp.toString());
|
parseRes = await parseXML(prms.queue.blResp.toString());
|
||||||
|
//Доработаем полученный JSON - корректно конвертируем массивы
|
||||||
|
converXMLArraysToJSON(parseRes, SJSON_CONTROL_ATTR_ARRAY);
|
||||||
//Вернём его клиенту в таком виде
|
//Вернём его клиенту в таком виде
|
||||||
return {
|
return {
|
||||||
optionsResp: {
|
optionsResp: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user