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)) }; }