Добавлена возможность ручного управления обработкой входящего сообщения - в JS-обработчик "ДО" теперь передается подключение к БД и объект ответа (обработчик может обращаться к объектам БД и сам отправлять ответ клиенту, останавливая дальнейшую обработку сообщения сервером)

This commit is contained in:
Mikhail Chechnev 2020-10-03 23:11:49 +03:00
parent df08376c29
commit 02a5a7cacc
3 changed files with 24 additions and 7 deletions

View File

@ -64,9 +64,7 @@ class DBConnector extends EventEmitter {
} catch (e) {
throw new ServerError(
SERR_MODULES_BAD_INTERFACE,
`Ошибка подключения пользовательского модуля: ${
e.message
}. Проверьте модуль на отсутствие синтаксических ошибок.`
`Ошибка подключения пользовательского модуля: ${e.message}. Проверьте модуль на отсутствие синтаксических ошибок.`
);
}
//Проверим его интерфейс

View File

@ -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,

View File

@ -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})`
}
}
});