From 02a5a7caccca4c40529ce631634594d09886e2b4 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sat, 3 Oct 2020 23:11:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D1=80=D1=83=D1=87=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=B2=D1=85=D0=BE=D0=B4=D1=8F=D1=89=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20-=20?= =?UTF-8?q?=D0=B2=20JS-=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=20"=D0=94=D0=9E"=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=20=D0=91=D0=94=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=20(=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BA=20=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D1=89=D0=B0=D1=82=D1=8C=D1=81=D1=8F=20=D0=BA=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=D0=BC=20=D0=91=D0=94=20?= =?UTF-8?q?=D0=B8=20=D1=81=D0=B0=D0=BC=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D1=8F=D1=82=D1=8C=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D1=83,=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B0=D0=B2=D0=BB=D0=B8=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D1=8C=D0=BD=D0=B5=D0=B9=D1=88=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/db_connector.js | 4 +--- core/in_queue.js | 17 +++++++++++++---- models/obj_in_queue.js | 10 ++++++++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/core/db_connector.js b/core/db_connector.js index c5870c7..d8affce 100644 --- a/core/db_connector.js +++ b/core/db_connector.js @@ -64,9 +64,7 @@ class DBConnector extends EventEmitter { } catch (e) { throw new ServerError( SERR_MODULES_BAD_INTERFACE, - `Ошибка подключения пользовательского модуля: ${ - e.message - }. Проверьте модуль на отсутствие синтаксических ошибок.` + `Ошибка подключения пользовательского модуля: ${e.message}. Проверьте модуль на отсутствие синтаксических ошибок.` ); } //Проверим его интерфейс diff --git a/core/in_queue.js b/core/in_queue.js index 47be205..f9e8a0e 100644 --- a/core/in_queue.js +++ b/core/in_queue.js @@ -112,6 +112,8 @@ class InQueue extends EventEmitter { //Параметры сообщения и ответа на него let options = {}; let optionsResp = {}; + //Флаг прекращения обработки сообщения + let bStopPropagation = false; //Определимся с телом сообщения - для POST сообщений - это тело запроса if (prms.function.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST) { blMsg = prms.req.body && !_.isEmpty(prms.req.body) ? prms.req.body : null; @@ -154,6 +156,8 @@ class InQueue extends EventEmitter { resBeforePrms.queue.blMsg = blMsg; resBeforePrms.queue.blResp = blResp; resBeforePrms.options = _.cloneDeep(options); + resBeforePrms.dbConn = this.dbConn; + resBeforePrms.res = prms.res; resBefore = await fnBefore(resBeforePrms); } catch (e) { throw new ServerError(SERR_APP_SERVER_BEFORE, e.message); @@ -199,6 +203,9 @@ class InQueue extends EventEmitter { if (!_.isUndefined(resBefore.bUnAuth)) if (resBefore.bUnAuth === true) throw new ServerError(SERR_UNAUTH, "Нет аутентификации"); + //Если пришел флаг прекращения дальнейшей обработки сообщения - то дальше его обработку прекращаем + if (!_.isUndefined(resBefore.bStopPropagation)) + if (resBefore.bStopPropagation === true) bStopPropagation = true; } else { //Или расскажем об ошибке throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); @@ -206,7 +213,7 @@ class InQueue extends EventEmitter { } } //Вызываем обработчик со стороны БД (если он есть) - if (prms.function.sPrcResp) { + if (bStopPropagation === false && prms.function.sPrcResp) { //Фиксируем начало исполнения сервером БД - в статусе сообщения q = await this.dbConn.setQueueState({ nQueueId: q.nId, @@ -244,7 +251,7 @@ class InQueue extends EventEmitter { } } //Выполняем обработчик "После" (если он есть) - if (prms.function.sAppSrvAfter) { + if (bStopPropagation === false && prms.function.sAppSrvAfter) { //Выставим статус сообщению очереди - исполняется сервером приложений q = await this.dbConn.setQueueState({ nQueueId: q.nId, @@ -303,8 +310,10 @@ class InQueue extends EventEmitter { } } //Всё успешно - отдаём результат клиенту - if (optionsResp.headers) prms.res.set(optionsResp.headers); - prms.res.status(200).send(blResp); + if (bStopPropagation === false) { + if (optionsResp.headers) prms.res.set(optionsResp.headers); + prms.res.status(200).send(blResp); + } //Фиксируем успех обработки - в статусе сообщения q = await this.dbConn.setQueueState({ nQueueId: q.nId, diff --git a/models/obj_in_queue.js b/models/obj_in_queue.js index 25c5df8..f9ab07d 100644 --- a/models/obj_in_queue.js +++ b/models/obj_in_queue.js @@ -52,6 +52,16 @@ exports.InQueueProcessorFnBefore = new Schema({ `Флаг ошибки аутентификации удаленного клиента (${path}) имеет некорректный тип данных (ожидалось - Boolean)`, required: path => `Не указан флаг ошибки аутентификации удаленного клиента (${path})` } + }, + //Флаг прекращения дальнейшей обработки сообщения + bStopPropagation: { + type: Boolean, + required: false, + message: { + type: path => + `Флаг прекращения дальнейшей обработки сообщения (${path}) имеет некорректный тип данных (ожидалось - Boolean)`, + required: path => `Не указан флаг прекращения дальнейшей обработки сообщения (${path})` + } } });