Реализована функция глубокого слияния объектов, применена в обработчиках входящих и исходящих сообщений для исправления бага слияния параметров отправки сообщения до и после вызова обработчика, для модуля PWS в этой связи убрал лишний код клонирования заголовка перед его изменением

This commit is contained in:
Mikhail Chechnev 2020-02-03 09:17:00 +03:00
parent 94622b9f8f
commit 4b6447160f
4 changed files with 23 additions and 18 deletions

View File

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

View File

@ -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) {

View File

@ -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;

View File

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