From 4b6447160fe78ba035461f2750cf260a87a2d0b5 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 3 Feb 2020 09:17:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B3=D0=BB=D1=83=D0=B1=D0=BE=D0=BA=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=D0=BE=D0=B2,=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=B0=D1=85=20?= =?UTF-8?q?=D0=B2=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D1=85=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B8=D1=85=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B1=D0=B0=D0=B3=D0=B0=20=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=20=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=B0,=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20PWS=20?= =?UTF-8?q?=D0=B2=20=D1=8D=D1=82=D0=BE=D0=B9=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B8=20=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB=D0=B8=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=B4=20=D0=BA=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=20=D0=B5=D0=B3=D0=BE=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/in_queue.js | 9 +++++---- core/out_queue_processor.js | 7 ++++--- core/utils.js | 12 +++++++++--- modules/pws.js | 13 +++++-------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/core/in_queue.js b/core/in_queue.js index 2649818..9c6fec4 100644 --- a/core/in_queue.js +++ b/core/in_queue.js @@ -19,7 +19,8 @@ const { buildURL, getAppSrvFunction, buildOptionsXML, - parseOptionsXML + parseOptionsXML, + deepMerge } = require("./utils"); //Вспомогательные функции const { NINC_EXEC_CNT_YES, NIS_ORIGINAL_NO } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД const objInQueueSchema = require("../models/obj_in_queue"); //Схема валидации сообщений обмена с бработчиком очереди входящих сообщений @@ -188,7 +189,7 @@ class InQueue extends EventEmitter { } //Фиксируем результат исполнения "До" - параметры ответа на запрос if (!_.isUndefined(resBefore.optionsResp)) { - _.extend(optionsResp, resBefore.optionsResp); + optionsResp = deepMerge(optionsResp, resBefore.optionsResp); let sOptionsResp = buildOptionsXML({ options: optionsResp }); q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp }); } @@ -229,7 +230,7 @@ class InQueue extends EventEmitter { if (prcRes.sOptionsResp) { try { let optionsRespTmp = await parseOptionsXML({ sOptions: prcRes.sOptionsResp }); - _.extend(optionsResp, optionsRespTmp); + optionsResp = deepMerge(optionsResp, optionsRespTmp); } catch (e) { await logger.warn( `Указанные для сообщения параметры ответа имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText( @@ -286,7 +287,7 @@ class InQueue extends EventEmitter { } //Фиксируем результат исполнения "После" - параметры ответа на запрос if (!_.isUndefined(resAfter.optionsResp)) { - _.extend(optionsResp, resAfter.optionsResp); + optionsResp = deepMerge(optionsResp, resAfter.optionsResp); let sOptionsResp = buildOptionsXML({ options: optionsResp }); q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp }); } diff --git a/core/out_queue_processor.js b/core/out_queue_processor.js index fdd6091..360c12c 100644 --- a/core/out_queue_processor.js +++ b/core/out_queue_processor.js @@ -18,7 +18,8 @@ const { getAppSrvFunction, buildURL, parseOptionsXML, - buildOptionsXML + buildOptionsXML, + deepMerge } = require("./utils"); //Вспомогательные функции const { ServerError } = require("./server_errors"); //Типовая ошибка const objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений @@ -156,7 +157,7 @@ const appProcess = async prms => { if (prms.queue.sOptions) { try { let optionsTmp = await parseOptionsXML({ sOptions: prms.queue.sOptions }); - _.extend(options, optionsTmp); + options = deepMerge(options, optionsTmp); } catch (e) { await logger.warn( `Указанные для сообщения параметры имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText( @@ -204,7 +205,7 @@ const appProcess = async prms => { } } //Применим ответ "До" - параметры отправки сообщения удаленному серверу - if (!_.isUndefined(resBefore.options)) _.extend(options, resBefore.options); + if (!_.isUndefined(resBefore.options)) options = deepMerge(options, resBefore.options); //Применим ответ "До" - флаг отсуствия аутентификации if (!_.isUndefined(resBefore.bUnAuth)) if (resBefore.bUnAuth === true) { diff --git a/core/utils.js b/core/utils.js index e4e0950..4ec5f9e 100644 --- a/core/utils.js +++ b/core/utils.js @@ -158,9 +158,7 @@ const getAppSrvFunction = sAppSrv => { mdl = require(makeModuleFullPath(moduleName)); } catch (e) { throw Error( - `Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${ - e.message - }` + `Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${e.message}` ); } //Проверяем, что в нём есть эта функция @@ -331,6 +329,13 @@ const getNowString = () => { return sNow; }; +//Глубокое слияние объектов +const deepMerge = (...args) => { + let res = {}; + for (let i = 0; i < args.length; i++) _.merge(res, args[i]); + return res; +}; + //----------------- // Интерфейс модуля //----------------- @@ -348,3 +353,4 @@ exports.parseXML = parseXML; exports.parseOptionsXML = parseOptionsXML; exports.buildOptionsXML = buildOptionsXML; exports.getNowString = getNowString; +exports.deepMerge = deepMerge; diff --git a/modules/pws.js b/modules/pws.js index ce99197..1499ec1 100644 --- a/modules/pws.js +++ b/modules/pws.js @@ -6,7 +6,6 @@ //---------------------- // Подключение библиотек //---------------------- -const _ = require("lodash"); //Работа с массивами и коллекциями const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML @@ -60,15 +59,13 @@ const after = async prms => { if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) { //Конвертируем ответ, подготовленный сервером, в JSON parseRes = await parseXML(prms.queue.blResp.toString()); - //Выставим в заголовке верный тип отправляемых данных - let tmpOptionsResp = _.cloneDeep(prms.optionsResp); - //Инициализируем заголовок если надо - if (!tmpOptionsResp.headers) tmpOptionsResp.headers = {}; - //Выставим ключ для JSON-данных - tmpOptionsResp.headers["content-type"] = SHEADER_CONTENT_TYPE_JSON; //Вернём его клиенту в таком виде return { - optionsResp: tmpOptionsResp, + optionsResp: { + headers: { + "content-type": SHEADER_CONTENT_TYPE_JSON + } + }, blResp: new Buffer(JSON.stringify(parseRes)) }; }