Работа с параметрами отправки и HTP-заголовками для исходящих (управление на PL/SQL)
This commit is contained in:
parent
078aa91aa6
commit
9f7c7d4589
@ -12,7 +12,14 @@ const _ = require("lodash"); //Работа с массивами и объек
|
|||||||
const rqp = require("request-promise"); //Работа с HTTP/HTTPS запросами
|
const rqp = require("request-promise"); //Работа с HTTP/HTTPS запросами
|
||||||
const lg = require("./logger"); //Протоколирование работы
|
const lg = require("./logger"); //Протоколирование работы
|
||||||
const db = require("./db_connector"); //Взаимодействие с БД
|
const db = require("./db_connector"); //Взаимодействие с БД
|
||||||
const { makeErrorText, validateObject, getAppSrvFunction, buildURL } = require("./utils"); //Вспомогательные функции
|
const {
|
||||||
|
makeErrorText,
|
||||||
|
validateObject,
|
||||||
|
getAppSrvFunction,
|
||||||
|
buildURL,
|
||||||
|
parseOptionsXML,
|
||||||
|
buildOptionsXML
|
||||||
|
} = 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"); //Схема валидации сообщений обмена с бработчиком очереди исходящих сообщений
|
||||||
const prmsOutQueueProcessorSchema = require("../models/prms_out_queue_processor"); //Схема валидации параметров функций модуля
|
const prmsOutQueueProcessorSchema = require("../models/prms_out_queue_processor"); //Схема валидации параметров функций модуля
|
||||||
@ -131,6 +138,8 @@ const appProcess = async prms => {
|
|||||||
_.extend(prms.service, serviceCtx);
|
_.extend(prms.service, serviceCtx);
|
||||||
//Собираем параметры для передачи серверу
|
//Собираем параметры для передачи серверу
|
||||||
let options = { method: prms.function.sFnPrmsType, encoding: null };
|
let options = { method: prms.function.sFnPrmsType, encoding: null };
|
||||||
|
//Инициализируем параметры ответа сервера
|
||||||
|
let optionsResp = {};
|
||||||
//Определимся с URL и телом сообщения в зависимости от способа передачи параметров
|
//Определимся с URL и телом сообщения в зависимости от способа передачи параметров
|
||||||
if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) {
|
if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) {
|
||||||
options.url = buildURL({ sSrvRoot: prms.service.sSrvRoot, sFnURL: prms.function.sFnURL });
|
options.url = buildURL({ sSrvRoot: prms.service.sSrvRoot, sFnURL: prms.function.sFnURL });
|
||||||
@ -142,12 +151,27 @@ const appProcess = async prms => {
|
|||||||
sQuery: prms.queue.blMsg === null ? "" : prms.queue.blMsg.toString()
|
sQuery: prms.queue.blMsg === null ? "" : prms.queue.blMsg.toString()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
//Дополним получившиеся параметры переданными в сообщении
|
||||||
|
if (prms.queue.sOptions) {
|
||||||
|
try {
|
||||||
|
let optionsTmp = await parseOptionsXML({ sOptions: prms.queue.sOptions });
|
||||||
|
_.extend(options, optionsTmp);
|
||||||
|
} catch (e) {
|
||||||
|
await logger.warn(
|
||||||
|
`Указанные для сообщения параметры имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText(
|
||||||
|
e
|
||||||
|
)}`,
|
||||||
|
{ nQueueId: prms.queue.nId }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
//Выполняем обработчик "До" (если он есть)
|
//Выполняем обработчик "До" (если он есть)
|
||||||
if (prms.function.sAppSrvBefore) {
|
if (prms.function.sAppSrvBefore) {
|
||||||
const fnBefore = getAppSrvFunction(prms.function.sAppSrvBefore);
|
const fnBefore = getAppSrvFunction(prms.function.sAppSrvBefore);
|
||||||
let resBefore = null;
|
let resBefore = null;
|
||||||
try {
|
try {
|
||||||
let resBeforePrms = _.cloneDeep(prms);
|
let resBeforePrms = _.cloneDeep(prms);
|
||||||
|
resBeforePrms.options = _.cloneDeep(options);
|
||||||
resBefore = await fnBefore(resBeforePrms);
|
resBefore = await fnBefore(resBeforePrms);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new ServerError(SERR_APP_SERVER_BEFORE, e.message);
|
throw new ServerError(SERR_APP_SERVER_BEFORE, e.message);
|
||||||
@ -209,15 +233,36 @@ const appProcess = async prms => {
|
|||||||
});
|
});
|
||||||
//Отправляем сообщение удалённому серверу
|
//Отправляем сообщение удалённому серверу
|
||||||
try {
|
try {
|
||||||
|
//Сохраняем параметры с которыми уходило сообщение
|
||||||
|
try {
|
||||||
|
let sOptions = buildOptionsXML({ options });
|
||||||
|
await dbConn.setQueueOptions({ nQueueId: prms.queue.nId, sOptions });
|
||||||
|
} catch (e) {
|
||||||
|
await logger.warn(`Не удалось сохранить параметры отправки сообщения: ${makeErrorText(e)}`, {
|
||||||
|
nQueueId: prms.queue.nId
|
||||||
|
});
|
||||||
|
}
|
||||||
//Ждем ответ от удалённого сервера
|
//Ждем ответ от удалённого сервера
|
||||||
|
options.resolveWithFullResponse = true;
|
||||||
let serverResp = await rqp(options);
|
let serverResp = await rqp(options);
|
||||||
//Сохраняем полученный ответ
|
//Сохраняем полученный ответ
|
||||||
prms.queue.blResp = new Buffer(serverResp || "");
|
prms.queue.blResp = new Buffer(serverResp.body || "");
|
||||||
await dbConn.setQueueResp({
|
await dbConn.setQueueResp({
|
||||||
nQueueId: prms.queue.nId,
|
nQueueId: prms.queue.nId,
|
||||||
blResp: prms.queue.blResp,
|
blResp: prms.queue.blResp,
|
||||||
nIsOriginal: NIS_ORIGINAL_YES
|
nIsOriginal: NIS_ORIGINAL_YES
|
||||||
});
|
});
|
||||||
|
//Сохраняем заголовки ответа
|
||||||
|
optionsResp.headers = _.cloneDeep(serverResp.headers);
|
||||||
|
try {
|
||||||
|
let sOptionsResp = buildOptionsXML({ options: optionsResp });
|
||||||
|
await dbConn.setQueueOptionsResp({ nQueueId: prms.queue.nId, sOptionsResp });
|
||||||
|
} catch (e) {
|
||||||
|
await logger.warn(
|
||||||
|
`Не удалось сохранить заголовок ответа удалённого сервера: ${makeErrorText(e)}`,
|
||||||
|
{ nQueueId: prms.queue.nId }
|
||||||
|
);
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//Прекращаем исполнение если были ошибки
|
//Прекращаем исполнение если были ошибки
|
||||||
let sError = "Неожиданная ошибка удалённого сервиса";
|
let sError = "Неожиданная ошибка удалённого сервиса";
|
||||||
@ -234,6 +279,8 @@ const appProcess = async prms => {
|
|||||||
let resAfter = null;
|
let resAfter = null;
|
||||||
try {
|
try {
|
||||||
let resAfterPrms = _.cloneDeep(prms);
|
let resAfterPrms = _.cloneDeep(prms);
|
||||||
|
resAfterPrms.options = _.cloneDeep(options);
|
||||||
|
resAfterPrms.optionsResp = _.cloneDeep(optionsResp);
|
||||||
resAfter = await fnAfter(resAfterPrms);
|
resAfter = await fnAfter(resAfterPrms);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new ServerError(SERR_APP_SERVER_AFTER, e.message);
|
throw new ServerError(SERR_APP_SERVER_AFTER, e.message);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user