Работа с параметрами отправки и HTP-заголовками для входящих (управление на PL/SQL)

This commit is contained in:
Mikhail Chechnev 2019-06-17 19:20:56 +03:00
parent 9f7c7d4589
commit 503b4b432b
3 changed files with 80 additions and 3 deletions

View File

@ -12,7 +12,14 @@ const EventEmitter = require("events"); //Обработчик пользова
const express = require("express"); //WEB-сервер Express
const bodyParser = require("body-parser"); //Модуль для Express (разбор тела входящего запроса)
const { ServerError } = require("./server_errors"); //Типовая ошибка
const { makeErrorText, validateObject, buildURL, getAppSrvFunction } = require("./utils"); //Вспомогательные функции
const {
makeErrorText,
validateObject,
buildURL,
getAppSrvFunction,
buildOptionsXML,
parseOptionsXML
} = require("./utils"); //Вспомогательные функции
const { NINC_EXEC_CNT_YES, NIS_ORIGINAL_NO } = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля взаимодействия с БД
const objInQueueSchema = require("../models/obj_in_queue"); //Схема валидации сообщений обмена с бработчиком очереди входящих сообщений
const objServiceSchema = require("../models/obj_service"); //Схемы валидации сервиса
@ -96,6 +103,9 @@ class InQueue extends EventEmitter {
//Тело сообщения и ответ на него
let blMsg = null;
let blResp = null;
//Параметры сообщения и ответа на него
let options = {};
let optionsResp = {};
//Определимся с телом сообщения - для POST сообщений - это тело запроса
if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) {
blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null;
@ -103,9 +113,15 @@ class InQueue extends EventEmitter {
//Для GET - параметры запроса
if (!_.isEmpty(prms.req.query)) blMsg = new Buffer(JSON.stringify(prms.req.query));
}
//Определимся с параметрами сообщения полученными от внешней системы
options = {
method: prms.req.method,
headers: _.cloneDeep(prms.req.headers)
};
//Кладём сообщение в очередь
q = await this.dbConn.putQueue({
nServiceFnId: prms.function.nId,
sOptions: buildOptionsXML({ options }),
blMsg
});
//Скажем что пришло новое входящее сообщение
@ -130,6 +146,7 @@ class InQueue extends EventEmitter {
resBeforePrms.queue = _.cloneDeep(q);
resBeforePrms.queue.blMsg = blMsg;
resBeforePrms.queue.blResp = blResp;
resBeforePrms.options = _.cloneDeep(options);
resBefore = await fnBefore(resBeforePrms);
} catch (e) {
throw new ServerError(SERR_APP_SERVER_BEFORE, e.message);
@ -148,7 +165,7 @@ class InQueue extends EventEmitter {
nQueueId: q.nId,
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
});
//Фиксируем результат исполнения
//Фиксируем результат исполнения "До" - обработанный запрос внешней системы
if (!_.isUndefined(resBefore.blMsg)) {
blMsg = resBefore.blMsg;
q = await this.dbConn.setQueueMsg({
@ -156,6 +173,7 @@ class InQueue extends EventEmitter {
blMsg
});
}
//Фиксируем результат исполнения "До" - ответ на запрос
if (!_.isUndefined(resBefore.blResp)) {
blResp = resBefore.blResp;
q = await this.dbConn.setQueueResp({
@ -164,6 +182,12 @@ class InQueue extends EventEmitter {
nIsOriginal: NIS_ORIGINAL_NO
});
}
//Фиксируем результат исполнения "До" - параметры ответа на запрос
if (!_.isUndefined(resBefore.optionsResp)) {
_.extend(optionsResp, resBefore.optionsResp);
let sOptionsResp = buildOptionsXML({ options: optionsResp });
q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp });
}
//Если пришел флаг ошибочной аутентификации и он положительный - то это ошибка, дальше ничего не делаем
if (!_.isUndefined(resBefore.bUnAuth))
if (resBefore.bUnAuth === true)
@ -197,6 +221,20 @@ class InQueue extends EventEmitter {
//Считаем ответ полученный от системы
let qData = await this.dbConn.getQueueResp({ nQueueId: q.nId });
blResp = qData.blResp;
//Запомним параметры ответа внешней системе, если обработчик их вернул
if (prcRes.sOptionsResp) {
try {
let optionsRespTmp = await parseOptionsXML({ sOptions: prcRes.sOptionsResp });
_.extend(optionsResp, optionsRespTmp);
} catch (e) {
await logger.warn(
`Указанные для сообщения параметры ответа имеют некорректный формат - использую параметры по умолчанию. Ошибка парсера: ${makeErrorText(
e
)}`,
{ nQueueId: prms.queue.nId }
);
}
}
}
//Выполняем обработчик "После" (если он есть)
if (prms.function.sAppSrvAfter) {
@ -213,6 +251,8 @@ class InQueue extends EventEmitter {
resAfterPrms.queue = _.cloneDeep(q);
resAfterPrms.queue.blMsg = blMsg;
resAfterPrms.queue.blResp = blResp;
resAfterPrms.options = _.cloneDeep(options);
resAfterPrms.optionsResp = _.cloneDeep(optionsResp);
resAfter = await fnAfter(resAfterPrms);
} catch (e) {
throw new ServerError(SERR_APP_SERVER_AFTER, e.message);
@ -231,7 +271,7 @@ class InQueue extends EventEmitter {
nQueueId: q.nId,
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
});
//Фиксируем результат исполнения
//Фиксируем результат исполнения "После" - ответ системы
if (!_.isUndefined(resAfter.blResp)) {
blResp = resAfter.blResp;
q = await this.dbConn.setQueueResp({
@ -240,6 +280,12 @@ class InQueue extends EventEmitter {
nIsOriginal: NIS_ORIGINAL_NO
});
}
//Фиксируем результат исполнения "После" - параметры ответа на запрос
if (!_.isUndefined(resAfter.optionsResp)) {
_.extend(optionsResp, resAfter.optionsResp);
let sOptionsResp = buildOptionsXML({ options: optionsResp });
q = await this.dbConn.setQueueOptionsResp({ nQueueId: q.nId, sOptionsResp });
}
//Если пришел флаг ошибочной аутентификации и он положительный - то это ошибка, дальше ничего не делаем
if (!_.isUndefined(resAfter.bUnAuth))
if (resAfter.bUnAuth === true) throw new ServerError(SERR_UNAUTH, "Нет аутентификации");
@ -250,6 +296,7 @@ class InQueue extends EventEmitter {
}
}
//Всё успешно - отдаём результат клиенту
if (optionsResp.headers) prms.res.set(optionsResp.headers);
prms.res.status(200).send(blResp);
//Фиксируем успех обработки - в статусе сообщения
q = await this.dbConn.setQueueState({

View File

@ -15,6 +15,16 @@ const Schema = require("validate"); //Схемы валидации
//Схема валидации результата работы функции "предобработки" сообщения очереди сервером приложений
exports.InQueueProcessorFnBefore = new Schema({
//Параметры ответа системы
optionsResp: {
type: Object,
required: false,
message: {
type: path =>
`Параметры ответа системы (${path}) имеют некорректный тип данных (ожидалось - Object, см. документацию к REQUEST - https://github.com/request/request)`,
required: path => `Не указаны параметры ответа системы (${path})`
}
},
//Обработанный запрос внешней системы
blMsg: {
type: Buffer,
@ -48,6 +58,16 @@ exports.InQueueProcessorFnBefore = new Schema({
//Схема валидации результата работы функции "постобработки" сообщения очереди сервером приложений
exports.InQueueProcessorFnAfter = new Schema({
//Параметры ответа системы
optionsResp: {
type: Object,
required: false,
message: {
type: path =>
`Параметры ответа системы (${path}) имеют некорректный тип данных (ожидалось - Object, см. документацию к REQUEST - https://github.com/request/request)`,
required: path => `Не указаны параметры ответа системы (${path})`
}
},
//Обработанный ответ системы
blResp: {
type: Buffer,

View File

@ -322,6 +322,16 @@ exports.QueuePrcResult = new Schema({
required: path => `Не указано состояние обработки сообщения очереди обмена (${path})`
}
},
//Параметры ответа на сообщение очереди обмена
sOptionsResp: {
type: String,
required: false,
message: {
type: path =>
`Параметры ответа на сообщение очереди обмена (${path}) имеют некорректный тип данных (ожидалось - String)`,
required: path => `Не указаны параметры ответа на сообщение очереди обмена (${path})`
}
},
//Информация от обработчика сообщения очереди обмена
sMsg: {
type: String,