Реализована функция глубокого слияния объектов, применена в обработчиках входящих и исходящих сообщений для исправления бага слияния параметров отправки сообщения до и после вызова обработчика, для модуля PWS в этой связи убрал лишний код клонирования заголовка перед его изменением
This commit is contained in:
parent
94622b9f8f
commit
4b6447160f
@ -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 });
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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))
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user