From 857db44faf4ea8b6cdddfacbe507faf8a9007298 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 10 Feb 2020 20:17:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BD=D0=B0=20xml2js=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?js2xmlparser=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20XML,=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=BD=D0=B0=D1=8F=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B0=D1=81=D1=81=D0=B8?= =?UTF-8?q?=D0=B2=D0=BE=D0=B2=20=D0=B2=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=BE=D0=BC=20JSON=20(=D0=BF=D1=80=D0=BE=D0=B1=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D0=B0=20-=20=D0=BA=D0=BE=D0=B3=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BD=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B0=D0=BB=D1=81=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B0=D1=81=D1=81=D0=B8=D0=B2,=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=B0=D0=B2=D0=B0=D0=BB=D0=BE=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B5=20=D0=BE=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/pws.js | 47 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/modules/pws.js b/modules/pws.js index 1499ec1..653dffe 100644 --- a/modules/pws.js +++ b/modules/pws.js @@ -6,15 +6,15 @@ //---------------------- // Подключение библиотек //---------------------- -const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON -const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML +const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML +const _ = require("lodash"); //Работа с коллекциями и объектами //--------------------- // Глобальные константы //--------------------- -//Наименования XML-элементов -const SREQUEST_ROOT = "XREQUEST"; //Корневой элемент XML-представления входящего запроса +//Наименования специальных управляющих атрибутов XML +const SJSON_CONTROL_ATTR_ARRAY = "___array___"; //Управляющий атрибут для указания параметров конвертации массива //Поля заголовка сообщения const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "content-type" для JSON @@ -26,23 +26,52 @@ const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "conten //Разбор XML const parseXML = xmlDoc => { 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); 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 => { //Если пришел запрос в JSON if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) { //Конвертируем полученный в JSON-запрос в XML, понятный серверной части - let request = {}; let requestXML = ""; try { - request = JSON.parse(prms.queue.blMsg.toString()); - requestXML = js2xmlparser.parse(SREQUEST_ROOT, request[SREQUEST_ROOT]); + let request = JSON.parse(prms.queue.blMsg.toString()); + let builder = new xml2js.Builder(); + requestXML = builder.buildObject(request); } catch (e) { requestXML = ""; } @@ -59,6 +88,8 @@ const after = async prms => { if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) { //Конвертируем ответ, подготовленный сервером, в JSON parseRes = await parseXML(prms.queue.blResp.toString()); + //Доработаем полученный JSON - корректно конвертируем массивы + converXMLArraysToJSON(parseRes, SJSON_CONTROL_ATTR_ARRAY); //Вернём его клиенту в таком виде return { optionsResp: {