Внедрение схем валидации параметров классов ParusAppServer, DBConnector, OutQueue

This commit is contained in:
Mikhail Chechnev 2018-11-27 21:49:40 +03:00
parent 38609f4c90
commit e9df76ac7b
4 changed files with 41 additions and 39 deletions

View File

@ -13,7 +13,7 @@ const oq = require("./out_queue"); //Прослушивание очереди
const { ServerError } = require("./server_errors"); //Типовая ошибка
const { validateObject } = require("./utils"); //Вспомогательные функции
const { SERR_COMMON, SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы
const objConfigSchema = require("../models/obj_config"); //Схема валидации файла настроек
const prmsAppSchema = require("../models/prms_app"); //Схема валидации параметров функций класса
//------------
// Тело модуля
//------------
@ -43,16 +43,16 @@ class ParusAppServer {
await this.logger.warn("Сервер приложений отключен от БД");
}
//Инициализация сервера
async init(cfg) {
async init(prms) {
await this.logger.info("Инициализация сервера приложений...");
//Проверяем структуру переданного объекта конфигурации
let sCheckResult = validateObject(cfg, objConfigSchema.config, "Настройки сервера приложений");
let sCheckResult = validateObject(prms, prmsAppSchema.init, "Параметры инициализации");
//Если настройки верны - будем стартовать
if (!sCheckResult) {
//Создаём подключение к БД
this.dbConn = new db.DBConnector(cfg.dbConnect);
this.dbConn = new db.DBConnector({ connectSettings: prms.config.dbConnect });
//Создаём обработчик очереди исходящих
this.outQ = new oq.OutQueue(cfg.outgoing, this.dbConn, this.logger);
this.outQ = new oq.OutQueue({ outGoing: prms.config.outGoing, dbConn: this.dbConn, logger: this.logger });
//Скажем что инициализировали
await this.logger.info("Сервер приложение инициализирован");
} else {

View File

@ -9,7 +9,6 @@
const _ = require("lodash"); //Работа с массивами и объектами
const EventEmitter = require("events"); //Обработчик пользовательских событий
const glConst = require("../core/constants"); //Глобальные константы
const { ServerError } = require("../core/server_errors"); //Типовая ошибка
const { makeModuleFullPath, validateObject } = require("../core/utils"); //Вспомогательные функции
const prmsDBConnectorSchema = require("../models/prms_db_connector"); //Схемы валидации параметров функций модуля
@ -18,6 +17,11 @@ const objServicesSchema = require("../models/obj_services"); //Схема вал
const objQueueSchema = require("../models/obj_queue"); //Схема валидации сообщения очереди обмена
const objQueuesSchema = require("../models/obj_queues"); //Схема валидации списка сообщений очереди обмена
const objLogSchema = require("../models/obj_log"); //Схема валидации записи журнала
const {
SERR_MODULES_BAD_INTERFACE,
SERR_OBJECT_BAD_INTERFACE,
SERR_MODULES_NO_MODULE_SPECIFIED
} = require("../core/constants"); //Глобальные константы
//----------
// Константы
@ -51,31 +55,31 @@ class DBConnector extends EventEmitter {
//Если структура объекта в норме
if (!sCheckResult) {
//Проверяем наличие модуля для работы с БД в настройках подключения
if (prms.sConnectorModule) {
if (prms.connectSettings.sConnectorModule) {
//Подключим модуль
this.connector = require(makeModuleFullPath(prms.sConnectorModule));
this.connector = require(makeModuleFullPath(prms.connectSettings.sConnectorModule));
//Проверим его интерфейс
let sCheckResult = validateObject(
this.connector,
intfDBConnectorModuleSchema.dbConnectorModule,
"Модуль " + prms.sConnectorModule
"Модуль " + prms.connectSettings.sConnectorModule
);
if (sCheckResult) {
throw new ServerError(glConst.SERR_MODULES_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_MODULES_BAD_INTERFACE, sCheckResult);
}
//Всё успешно - сохраним настройки подключения
this.connectSettings = _.cloneDeep(prms);
this.connectSettings = _.cloneDeep(prms.connectSettings);
//Инициализируем остальные свойства
this.connection = null;
this.bConnected = false;
} else {
throw new ServerError(
glConst.SERR_MODULES_NO_MODULE_SPECIFIED,
SERR_MODULES_NO_MODULE_SPECIFIED,
"Не указано имя подключаемого модуля-коннектора!"
);
}
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
}
//Подключиться к БД
@ -146,11 +150,11 @@ class DBConnector extends EventEmitter {
//Валидируем финальный объект
sCheckResult = validateObject({ services: res }, objServicesSchema.Services, "Список сервисов");
//Если валидация не прошла
if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Успешно - отдаём список сервисов
return res;
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} catch (e) {
if (e instanceof ServerError) throw e;
@ -180,14 +184,14 @@ class DBConnector extends EventEmitter {
let res = await this.connector.log(logData);
//Валидируем полученный ответ
sCheckResult = validateObject(res, objLogSchema.Log, "Добавленная запись журнала работы");
if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Вернём добавленную запись
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
@ -264,14 +268,14 @@ class DBConnector extends EventEmitter {
objQueuesSchema.Queues,
"Список сообщений очереди обмена"
);
if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Вернём сообщения очереди обмена
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
@ -292,7 +296,7 @@ class DBConnector extends EventEmitter {
let res = await this.connector.setQueueState(setStateData);
//Валидируем полученный ответ
sCheckResult = validateObject(res, objQueueSchema.Queue, "Изменённое сообщение очереди обмена");
if (sCheckResult) throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
if (sCheckResult) throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
//Вернём измененную запись
return res;
} catch (e) {
@ -300,7 +304,7 @@ class DBConnector extends EventEmitter {
else throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");

View File

@ -9,7 +9,10 @@
const _ = require("lodash"); //Работа с массивами и коллекциями
const EventEmitter = require("events"); //Обработчик пользовательских событий
const { checkObject } = require("../core/utils"); //Вспомогательные функции
const { ServerError } = require("./server_errors"); //Типовая ошибка
const { SERR_OBJECT_BAD_INTERFACE } = require("./constants"); //Общесистемные константы
const { validateObject } = require("../core/utils"); //Вспомогательные функции
const prmsOutQueueSchema = require("../models/prms_out_queue"); //Схемы валидации параметров функций класса
//--------------------------
// Глобальные идентификаторы
@ -24,14 +27,12 @@ const SEVT_OUT_QUEUE_NEW = "OUT_QUEUE_NEW"; //Новое сообщение в
//Класс очереди сообщений
class OutQueue extends EventEmitter {
//конструктор класса
constructor(prms, dbConn, logger) {
//Конструктор класса
constructor(prms) {
//Создадим экземпляр родительского класса
super();
//Проверяем структуру переданного объекта с параметрами очереди
let sCheckResult = checkObject(prms, {
fields: [{ sName: "nPortionSize", bRequired: true }, { sName: "nCheckTimeout", bRequired: true }]
});
//Проверяем структуру переданного объекта для подключения
let sCheckResult = validateObject(prms, prmsOutQueueSchema.OutQueue, "Параметры конструктора класса OutQueue");
//Если структура объекта в норме
if (!sCheckResult) {
//Хранилище очереди сообщений
@ -39,18 +40,15 @@ class OutQueue extends EventEmitter {
//Признак функционирования обработчика
this.bWorking = false;
//Параметры очереди
_.extend(this, prms);
this.outGoing = _.cloneDeep(prms.outGoing);
//Запомним подключение к БД
this.dbConn = dbConn;
this.dbConn = prms.dbConn;
//Запомним логгер
this.logger = logger;
this.logger = prms.logger;
//Привяжем методы к указателю на себя для использования в обработчиках событий
this.outDetectingLoop = this.outDetectingLoop.bind(this);
} else {
throw new ServerError(
glConst.SERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + sCheckResult
);
throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
}
//Добавление нового исходящего сообщения в очередь для отработки
@ -58,7 +56,7 @@ class OutQueue extends EventEmitter {
//Cоздадим новый элемент очереди
let tmp = {};
_.extend(tmp, message);
//добавим его в очередь
//Добавим его в очередь
this.queue.push(tmp);
}
//Уведомление о получении нового сообщения
@ -71,13 +69,13 @@ class OutQueue extends EventEmitter {
if (this.bWorking)
setTimeout(() => {
this.outDetectingLoop();
}, this.nCheckTimeout);
}, this.outGoing.nCheckTimeout);
}
//Опрос очереди исходящих сообщений
async outDetectingLoop() {
//Сходим на сервер за очередным исходящим сообщением
try {
let outMsgs = await this.dbConn.getOutgoing({ nPortionSize: this.nPortionSize });
let outMsgs = await this.dbConn.getOutgoing({ nPortionSize: this.outGoing.nPortionSize });
if (Array.isArray(outMsgs) && outMsgs.length > 0) {
let logAll = outMsgs.map(async msg => {
await this.logger.info(

View File

@ -41,7 +41,7 @@ process.on("SIGINT", () => {
//Старутем
appSrv
.init(cfg)
.init({ config: cfg })
.then(r => {
appSrv
.run()