Добавлена возможность ручного управления обработкой входящего сообщения - в 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) { } catch (e) {
throw new ServerError( throw new ServerError(
SERR_MODULES_BAD_INTERFACE, SERR_MODULES_BAD_INTERFACE,
`Ошибка подключения пользовательского модуля: ${ `Ошибка подключения пользовательского модуля: ${e.message}. Проверьте модуль на отсутствие синтаксических ошибок.`
e.message
}. Проверьте модуль на отсутствие синтаксических ошибок.`
); );
} }
//Проверим его интерфейс //Проверим его интерфейс

View File

@ -112,6 +112,8 @@ class InQueue extends EventEmitter {
//Параметры сообщения и ответа на него //Параметры сообщения и ответа на него
let options = {}; let options = {};
let optionsResp = {}; let optionsResp = {};
//Флаг прекращения обработки сообщения
let bStopPropagation = false;
//Определимся с телом сообщения - для 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;
@ -154,6 +156,8 @@ class InQueue extends EventEmitter {
resBeforePrms.queue.blMsg = blMsg; resBeforePrms.queue.blMsg = blMsg;
resBeforePrms.queue.blResp = blResp; resBeforePrms.queue.blResp = blResp;
resBeforePrms.options = _.cloneDeep(options); resBeforePrms.options = _.cloneDeep(options);
resBeforePrms.dbConn = this.dbConn;
resBeforePrms.res = prms.res;
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);
@ -199,6 +203,9 @@ class InQueue extends EventEmitter {
if (!_.isUndefined(resBefore.bUnAuth)) if (!_.isUndefined(resBefore.bUnAuth))
if (resBefore.bUnAuth === true) if (resBefore.bUnAuth === true)
throw new ServerError(SERR_UNAUTH, "Нет аутентификации"); throw new ServerError(SERR_UNAUTH, "Нет аутентификации");
//Если пришел флаг прекращения дальнейшей обработки сообщения - то дальше его обработку прекращаем
if (!_.isUndefined(resBefore.bStopPropagation))
if (resBefore.bStopPropagation === true) bStopPropagation = true;
} else { } else {
//Или расскажем об ошибке //Или расскажем об ошибке
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); 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({ q = await this.dbConn.setQueueState({
nQueueId: q.nId, 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({ q = await this.dbConn.setQueueState({
nQueueId: q.nId, nQueueId: q.nId,
@ -303,8 +310,10 @@ class InQueue extends EventEmitter {
} }
} }
//Всё успешно - отдаём результат клиенту //Всё успешно - отдаём результат клиенту
if (bStopPropagation === false) {
if (optionsResp.headers) prms.res.set(optionsResp.headers); 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({
nQueueId: q.nId, nQueueId: q.nId,

View File

@ -52,6 +52,16 @@ exports.InQueueProcessorFnBefore = new Schema({
`Флаг ошибки аутентификации удаленного клиента (${path}) имеет некорректный тип данных (ожидалось - Boolean)`, `Флаг ошибки аутентификации удаленного клиента (${path}) имеет некорректный тип данных (ожидалось - Boolean)`,
required: path => `Не указан флаг ошибки аутентификации удаленного клиента (${path})` required: path => `Не указан флаг ошибки аутентификации удаленного клиента (${path})`
} }
},
//Флаг прекращения дальнейшей обработки сообщения
bStopPropagation: {
type: Boolean,
required: false,
message: {
type: path =>
`Флаг прекращения дальнейшей обработки сообщения (${path}) имеет некорректный тип данных (ожидалось - Boolean)`,
required: path => `Не указан флаг прекращения дальнейшей обработки сообщения (${path})`
}
} }
}); });