Работа с параметрами отправки и HTP-заголовками для входящих (управление на PL/SQL)
This commit is contained in:
parent
9f7c7d4589
commit
503b4b432b
@ -12,7 +12,14 @@ const EventEmitter = require("events"); //Обработчик пользова
|
|||||||
const express = require("express"); //WEB-сервер Express
|
const express = require("express"); //WEB-сервер Express
|
||||||
const bodyParser = require("body-parser"); //Модуль для Express (разбор тела входящего запроса)
|
const bodyParser = require("body-parser"); //Модуль для Express (разбор тела входящего запроса)
|
||||||
const { ServerError } = require("./server_errors"); //Типовая ошибка
|
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 { 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"); //Схема валидации сообщений обмена с бработчиком очереди входящих сообщений
|
||||||
const objServiceSchema = require("../models/obj_service"); //Схемы валидации сервиса
|
const objServiceSchema = require("../models/obj_service"); //Схемы валидации сервиса
|
||||||
@ -96,6 +103,9 @@ class InQueue extends EventEmitter {
|
|||||||
//Тело сообщения и ответ на него
|
//Тело сообщения и ответ на него
|
||||||
let blMsg = null;
|
let blMsg = null;
|
||||||
let blResp = null;
|
let blResp = null;
|
||||||
|
//Параметры сообщения и ответа на него
|
||||||
|
let options = {};
|
||||||
|
let optionsResp = {};
|
||||||
//Определимся с телом сообщения - для POST сообщений - это тело запроса
|
//Определимся с телом сообщения - для POST сообщений - это тело запроса
|
||||||
if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) {
|
if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) {
|
||||||
blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null;
|
blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null;
|
||||||
@ -103,9 +113,15 @@ class InQueue extends EventEmitter {
|
|||||||
//Для GET - параметры запроса
|
//Для GET - параметры запроса
|
||||||
if (!_.isEmpty(prms.req.query)) blMsg = new Buffer(JSON.stringify(prms.req.query));
|
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({
|
q = await this.dbConn.putQueue({
|
||||||
nServiceFnId: prms.function.nId,
|
nServiceFnId: prms.function.nId,
|
||||||
|
sOptions: buildOptionsXML({ options }),
|
||||||
blMsg
|
blMsg
|
||||||
});
|
});
|
||||||
//Скажем что пришло новое входящее сообщение
|
//Скажем что пришло новое входящее сообщение
|
||||||
@ -130,6 +146,7 @@ class InQueue extends EventEmitter {
|
|||||||
resBeforePrms.queue = _.cloneDeep(q);
|
resBeforePrms.queue = _.cloneDeep(q);
|
||||||
resBeforePrms.queue.blMsg = blMsg;
|
resBeforePrms.queue.blMsg = blMsg;
|
||||||
resBeforePrms.queue.blResp = blResp;
|
resBeforePrms.queue.blResp = blResp;
|
||||||
|
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);
|
||||||
@ -148,7 +165,7 @@ class InQueue extends EventEmitter {
|
|||||||
nQueueId: q.nId,
|
nQueueId: q.nId,
|
||||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
|
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
|
||||||
});
|
});
|
||||||
//Фиксируем результат исполнения
|
//Фиксируем результат исполнения "До" - обработанный запрос внешней системы
|
||||||
if (!_.isUndefined(resBefore.blMsg)) {
|
if (!_.isUndefined(resBefore.blMsg)) {
|
||||||
blMsg = resBefore.blMsg;
|
blMsg = resBefore.blMsg;
|
||||||
q = await this.dbConn.setQueueMsg({
|
q = await this.dbConn.setQueueMsg({
|
||||||
@ -156,6 +173,7 @@ class InQueue extends EventEmitter {
|
|||||||
blMsg
|
blMsg
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
//Фиксируем результат исполнения "До" - ответ на запрос
|
||||||
if (!_.isUndefined(resBefore.blResp)) {
|
if (!_.isUndefined(resBefore.blResp)) {
|
||||||
blResp = resBefore.blResp;
|
blResp = resBefore.blResp;
|
||||||
q = await this.dbConn.setQueueResp({
|
q = await this.dbConn.setQueueResp({
|
||||||
@ -164,6 +182,12 @@ class InQueue extends EventEmitter {
|
|||||||
nIsOriginal: NIS_ORIGINAL_NO
|
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 (!_.isUndefined(resBefore.bUnAuth))
|
||||||
if (resBefore.bUnAuth === true)
|
if (resBefore.bUnAuth === true)
|
||||||
@ -197,6 +221,20 @@ class InQueue extends EventEmitter {
|
|||||||
//Считаем ответ полученный от системы
|
//Считаем ответ полученный от системы
|
||||||
let qData = await this.dbConn.getQueueResp({ nQueueId: q.nId });
|
let qData = await this.dbConn.getQueueResp({ nQueueId: q.nId });
|
||||||
blResp = qData.blResp;
|
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) {
|
if (prms.function.sAppSrvAfter) {
|
||||||
@ -213,6 +251,8 @@ class InQueue extends EventEmitter {
|
|||||||
resAfterPrms.queue = _.cloneDeep(q);
|
resAfterPrms.queue = _.cloneDeep(q);
|
||||||
resAfterPrms.queue.blMsg = blMsg;
|
resAfterPrms.queue.blMsg = blMsg;
|
||||||
resAfterPrms.queue.blResp = blResp;
|
resAfterPrms.queue.blResp = blResp;
|
||||||
|
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);
|
||||||
@ -231,7 +271,7 @@ class InQueue extends EventEmitter {
|
|||||||
nQueueId: q.nId,
|
nQueueId: q.nId,
|
||||||
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
|
nExecState: objQueueSchema.NQUEUE_EXEC_STATE_APP_OK
|
||||||
});
|
});
|
||||||
//Фиксируем результат исполнения
|
//Фиксируем результат исполнения "После" - ответ системы
|
||||||
if (!_.isUndefined(resAfter.blResp)) {
|
if (!_.isUndefined(resAfter.blResp)) {
|
||||||
blResp = resAfter.blResp;
|
blResp = resAfter.blResp;
|
||||||
q = await this.dbConn.setQueueResp({
|
q = await this.dbConn.setQueueResp({
|
||||||
@ -240,6 +280,12 @@ class InQueue extends EventEmitter {
|
|||||||
nIsOriginal: NIS_ORIGINAL_NO
|
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 (!_.isUndefined(resAfter.bUnAuth))
|
||||||
if (resAfter.bUnAuth === true) throw new ServerError(SERR_UNAUTH, "Нет аутентификации");
|
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);
|
prms.res.status(200).send(blResp);
|
||||||
//Фиксируем успех обработки - в статусе сообщения
|
//Фиксируем успех обработки - в статусе сообщения
|
||||||
q = await this.dbConn.setQueueState({
|
q = await this.dbConn.setQueueState({
|
||||||
|
@ -15,6 +15,16 @@ const Schema = require("validate"); //Схемы валидации
|
|||||||
|
|
||||||
//Схема валидации результата работы функции "предобработки" сообщения очереди сервером приложений
|
//Схема валидации результата работы функции "предобработки" сообщения очереди сервером приложений
|
||||||
exports.InQueueProcessorFnBefore = new Schema({
|
exports.InQueueProcessorFnBefore = new Schema({
|
||||||
|
//Параметры ответа системы
|
||||||
|
optionsResp: {
|
||||||
|
type: Object,
|
||||||
|
required: false,
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Параметры ответа системы (${path}) имеют некорректный тип данных (ожидалось - Object, см. документацию к REQUEST - https://github.com/request/request)`,
|
||||||
|
required: path => `Не указаны параметры ответа системы (${path})`
|
||||||
|
}
|
||||||
|
},
|
||||||
//Обработанный запрос внешней системы
|
//Обработанный запрос внешней системы
|
||||||
blMsg: {
|
blMsg: {
|
||||||
type: Buffer,
|
type: Buffer,
|
||||||
@ -48,6 +58,16 @@ exports.InQueueProcessorFnBefore = new Schema({
|
|||||||
|
|
||||||
//Схема валидации результата работы функции "постобработки" сообщения очереди сервером приложений
|
//Схема валидации результата работы функции "постобработки" сообщения очереди сервером приложений
|
||||||
exports.InQueueProcessorFnAfter = 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: {
|
blResp: {
|
||||||
type: Buffer,
|
type: Buffer,
|
||||||
|
@ -322,6 +322,16 @@ exports.QueuePrcResult = new Schema({
|
|||||||
required: path => `Не указано состояние обработки сообщения очереди обмена (${path})`
|
required: path => `Не указано состояние обработки сообщения очереди обмена (${path})`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
//Параметры ответа на сообщение очереди обмена
|
||||||
|
sOptionsResp: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Параметры ответа на сообщение очереди обмена (${path}) имеют некорректный тип данных (ожидалось - String)`,
|
||||||
|
required: path => `Не указаны параметры ответа на сообщение очереди обмена (${path})`
|
||||||
|
}
|
||||||
|
},
|
||||||
//Информация от обработчика сообщения очереди обмена
|
//Информация от обработчика сообщения очереди обмена
|
||||||
sMsg: {
|
sMsg: {
|
||||||
type: String,
|
type: String,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user