Реализована функция глубокого слияния объектов, применена в обработчиках входящих и исходящих сообщений для исправления бага слияния параметров отправки сообщения до и после вызова обработчика, для модуля 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, buildURL,
getAppSrvFunction, getAppSrvFunction,
buildOptionsXML, buildOptionsXML,
parseOptionsXML parseOptionsXML,
deepMerge
} = require("./utils"); //Вспомогательные функции } = require("./utils"); //Вспомогательные функции
const { NINC_EXEC_CNT_YES, NIS_ORIGINAL_NO } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД const { NINC_EXEC_CNT_YES, NIS_ORIGINAL_NO } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД
const objInQueueSchema = require("../models/obj_in_queue"); //Схема валидации сообщений обмена с бработчиком очереди входящих сообщений const objInQueueSchema = require("../models/obj_in_queue"); //Схема валидации сообщений обмена с бработчиком очереди входящих сообщений
@ -188,7 +189,7 @@ class InQueue extends EventEmitter {
} }
//Фиксируем результат исполнения "До" - параметры ответа на запрос //Фиксируем результат исполнения "До" - параметры ответа на запрос
if (!_.isUndefined(resBefore.optionsResp)) { if (!_.isUndefined(resBefore.optionsResp)) {
_.extend(optionsResp, resBefore.optionsResp); optionsResp = deepMerge(optionsResp, resBefore.optionsResp);
let sOptionsResp = buildOptionsXML({ options: optionsResp }); let sOptionsResp = buildOptionsXML({ options: optionsResp });
q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp }); q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp });
} }
@ -229,7 +230,7 @@ class InQueue extends EventEmitter {
if (prcRes.sOptionsResp) { if (prcRes.sOptionsResp) {
try { try {
let optionsRespTmp = await parseOptionsXML({ sOptions: prcRes.sOptionsResp }); let optionsRespTmp = await parseOptionsXML({ sOptions: prcRes.sOptionsResp });
_.extend(optionsResp, optionsRespTmp); optionsResp = deepMerge(optionsResp, optionsRespTmp);
} catch (e) { } catch (e) {
await logger.warn( await logger.warn(
`Указанные для сообщения параметры ответа имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText( `Указанные для сообщения параметры ответа имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText(
@ -286,7 +287,7 @@ class InQueue extends EventEmitter {
} }
//Фиксируем результат исполнения "После" - параметры ответа на запрос //Фиксируем результат исполнения "После" - параметры ответа на запрос
if (!_.isUndefined(resAfter.optionsResp)) { if (!_.isUndefined(resAfter.optionsResp)) {
_.extend(optionsResp, resAfter.optionsResp); optionsResp = deepMerge(optionsResp, resAfter.optionsResp);
let sOptionsResp = buildOptionsXML({ options: optionsResp }); let sOptionsResp = buildOptionsXML({ options: optionsResp });
q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp }); q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp });
} }

View File

@ -18,7 +18,8 @@ const {
getAppSrvFunction, getAppSrvFunction,
buildURL, buildURL,
parseOptionsXML, parseOptionsXML,
buildOptionsXML buildOptionsXML,
deepMerge
} = require("./utils"); //Вспомогательные функции } = require("./utils"); //Вспомогательные функции
const { ServerError } = require("./server_errors"); //Типовая ошибка const { ServerError } = require("./server_errors"); //Типовая ошибка
const objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений const objOutQueueProcessorSchema = require("../models/obj_out_queue_processor"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений
@ -156,7 +157,7 @@ const appProcess = async prms => {
if (prms.queue.sOptions) { if (prms.queue.sOptions) {
try { try {
let optionsTmp = await parseOptionsXML({ sOptions: prms.queue.sOptions }); let optionsTmp = await parseOptionsXML({ sOptions: prms.queue.sOptions });
_.extend(options, optionsTmp); options = deepMerge(options, optionsTmp);
} catch (e) { } catch (e) {
await logger.warn( await logger.warn(
`Указанные для сообщения параметры имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText( `Указанные для сообщения параметры имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${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 (!_.isUndefined(resBefore.bUnAuth))
if (resBefore.bUnAuth === true) { if (resBefore.bUnAuth === true) {

View File

@ -158,9 +158,7 @@ const getAppSrvFunction = sAppSrv => {
mdl = require(makeModuleFullPath(moduleName)); mdl = require(makeModuleFullPath(moduleName));
} catch (e) { } catch (e) {
throw Error( throw Error(
`Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${ `Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${e.message}`
e.message
}`
); );
} }
//Проверяем, что в нём есть эта функция //Проверяем, что в нём есть эта функция
@ -331,6 +329,13 @@ const getNowString = () => {
return sNow; 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.parseOptionsXML = parseOptionsXML;
exports.buildOptionsXML = buildOptionsXML; exports.buildOptionsXML = buildOptionsXML;
exports.getNowString = getNowString; exports.getNowString = getNowString;
exports.deepMerge = deepMerge;

View File

@ -6,7 +6,6 @@
//---------------------- //----------------------
// Подключение библиотек // Подключение библиотек
//---------------------- //----------------------
const _ = require("lodash"); //Работа с массивами и коллекциями
const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON
const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML
@ -60,15 +59,13 @@ 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());
//Выставим в заголовке верный тип отправляемых данных
let tmpOptionsResp = _.cloneDeep(prms.optionsResp);
//Инициализируем заголовок если надо
if (!tmpOptionsResp.headers) tmpOptionsResp.headers = {};
//Выставим ключ для JSON-данных
tmpOptionsResp.headers["content-type"] = SHEADER_CONTENT_TYPE_JSON;
//Вернём его клиенту в таком виде //Вернём его клиенту в таком виде
return { return {
optionsResp: tmpOptionsResp, optionsResp: {
headers: {
"content-type": SHEADER_CONTENT_TYPE_JSON
}
},
blResp: new Buffer(JSON.stringify(parseRes)) blResp: new Buffer(JSON.stringify(parseRes))
}; };
} }