Приведение всех простых идентификаторов к виду xName, где x - ссылкана тип данных, подключение логгера к БД

This commit is contained in:
Mikhail Chechnev 2018-11-17 18:14:10 +03:00
parent 326565d3b4
commit edda9c0e3b
8 changed files with 337 additions and 180 deletions

View File

@ -8,17 +8,17 @@
//-----------------
//Путь к модулям
exports.MODULES_PATH_CORE = "@core"; //Модули ядра
exports.MODULES_PATH_EX = "@modules"; //Дополнительные пользовательские модули
exports.SMODULES_PATH_CORE = "@core"; //Модули ядра
exports.SMODULES_PATH_EX = "@modules"; //Дополнительные пользовательские модули
//Типовые коды ошибок подключения модулей
exports.ERR_MODULES_NO_MODULE_SPECIFIED = "ERR_MODULES_NO_MODULE_SPECIFIED"; //Не указан подключаемый модуль
exports.ERR_MODULES_BAD_INTERFACE = "ERR_MODULES_BAD_INTERFACE"; //Ошибочный интерфейс подключаемого модуля
exports.SERR_MODULES_NO_MODULE_SPECIFIED = "ERR_MODULES_NO_MODULE_SPECIFIED"; //Не указан подключаемый модуль
exports.SERR_MODULES_BAD_INTERFACE = "ERR_MODULES_BAD_INTERFACE"; //Ошибочный интерфейс подключаемого модуля
//Типовые коды ошибок работы с объектами
exports.ERR_OBJECT_BAD_INTERFACE = "ERR_OBJECT_BAD_INTERFACE"; //Ошибочный интерфейс объекта
exports.SERR_OBJECT_BAD_INTERFACE = "ERR_OBJECT_BAD_INTERFACE"; //Ошибочный интерфейс объекта
//Типовые коды ошибок работы с БД
exports.ERR_DB_CONNECT = "ERR_DB_CONNECT"; //Ошибка подключения к БД
exports.ERR_DB_DISCONNECT = "ERR_DB_DISCONNECT"; //Ошибка отключения от БД
exports.ERR_DB_EXECUTE = "ERR_DB_EXECUTE"; //Ошибка исполнения функции в БД
exports.SERR_DB_CONNECT = "ERR_DB_CONNECT"; //Ошибка подключения к БД
exports.SERR_DB_DISCONNECT = "ERR_DB_DISCONNECT"; //Ошибка отключения от БД
exports.SERR_DB_EXECUTE = "ERR_DB_EXECUTE"; //Ошибка исполнения функции в БД

View File

@ -8,9 +8,9 @@
//----------------------
const _ = require("lodash"); //Работа с массивами и объектами
const glConst = require("@core/constants.js"); //Глобальные константы
const { checkModuleInterface, makeModuleFullPath, checkObject } = require("@core/utils.js"); //Вспомогательные функции
const { ServerError } = require("@core/server_errors.js"); //Типовая ошибка
const glConst = require("../core/constants.js"); //Глобальные константы
const { ServerError } = require("../core/server_errors.js"); //Типовая ошибка
const { checkModuleInterface, makeModuleFullPath, checkObject } = require("../core/utils.js"); //Вспомогательные функции
//----------
// Константы
@ -29,17 +29,17 @@ class DBConnector {
//Конструктор
constructor(prms) {
//Проверяем структуру переданного объекта для подключения
let checkResult = checkObject(prms, {
let sCheckResult = checkObject(prms, {
fields: [
{ name: "sUser", required: true },
{ name: "sPassword", required: true },
{ name: "sConnectString", required: true },
{ name: "sSessionModuleName", required: true },
{ name: "sConnectorModule", required: false }
{ sName: "sUser", bRequired: true },
{ sName: "sPassword", bRequired: true },
{ sName: "sConnectString", bRequired: true },
{ sName: "sSessionModuleName", bRequired: true },
{ sName: "sConnectorModule", bRequired: false }
]
});
//Если структура объекта в норме
if (!checkResult) {
if (!sCheckResult) {
//Проверяем наличие модуля для работы с БД в настройках подключения
if (prms.sConnectorModule) {
//Подключим модуль
@ -60,7 +60,7 @@ class DBConnector {
})
) {
throw new ServerError(
glConst.ERR_MODULES_BAD_INTERFACE,
glConst.SERR_MODULES_BAD_INTERFACE,
"Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!"
);
}
@ -69,121 +69,167 @@ class DBConnector {
_.extend(this.connectSettings, prms);
//Инициализируем остальные свойства
this.connection = {};
this.bConnected = false;
} else {
throw new ServerError(
glConst.ERR_MODULES_NO_MODULE_SPECIFIED,
glConst.SERR_MODULES_NO_MODULE_SPECIFIED,
"Не указано имя подключаемого модуля-коннектора!"
);
}
} else {
throw new ServerError(
glConst.ERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + checkResult
glConst.SERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + sCheckResult
);
}
}
//Подключиться к БД
async connect() {
try {
this.connection = await this.connector.connect({
sUser: this.connectSettings.sUser,
sPassword: this.connectSettings.sPassword,
sConnectString: this.connectSettings.sConnectString,
sSessionModuleName: this.connectSettings.sSessionModuleName
});
this.connection = await this.connector.connect(this.connectSettings);
this.bConnected = true;
return this.connection;
} catch (e) {
throw new ServerError(glConst.ERR_DB_CONNECT, e.message);
throw new ServerError(glConst.SERR_DB_CONNECT, e.message);
}
}
//Отключиться от БД
async disconnect() {
try {
await this.connector.disconnect({ connection: this.connection });
this.connection = {};
return;
} catch (e) {
throw new ServerError(glConst.ERR_DB_DISCONNECT, e.message);
if (this.bConnected) {
try {
await this.connector.disconnect({ connection: this.connection });
this.connection = {};
this.bConnected = false;
return;
} catch (e) {
throw new ServerError(glConst.SERR_DB_DISCONNECT, e.message);
}
}
}
//Получить список сервисов
async getServices() {
try {
let srvs = await this.connector.getServices({ connection: this.connection });
let srvsFuncs = srvs.map(async srv => {
const response = await this.connector.getServiceFunctions({
connection: this.connection,
ddd: srv.NRN
if (this.bConnected) {
try {
let srvs = await this.connector.getServices({ connection: this.connection });
let srvsFuncs = srvs.map(async srv => {
const response = await this.connector.getServiceFunctions({
connection: this.connection,
nServiceId: srv.nId
});
let tmp = {};
_.extend(tmp, srv, { functions: [] });
response.map(f => {
tmp.functions.push(f);
});
return tmp;
});
let tmp = {};
_.extend(tmp, srv, { FN: [] });
response.map(f => {
tmp.FN.push(f);
});
return tmp;
});
let res = await Promise.all(srvsFuncs);
return res;
} catch (e) {
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
let res = await Promise.all(srvsFuncs);
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Запись в журнал работы
async putLog(prms) {
//Проверяем структуру переданного объекта для подключения
let checkResult = checkObject(prms, {
fields: [
{ name: "nLogState", required: true },
{ name: "sMsg", required: false },
{ name: "nServiceId", required: false },
{ name: "nServiceFnId", required: false },
{ name: "nQueueId", required: false }
]
});
//Если структура объекта в норме
if (!checkResult) {
try {
let res = await this.connector.log({
connection: this.connection,
nLogState: prms.nLogState,
sMsg: prms.sMsg,
nServiceId: prms.nServiceId,
nServiceFnId: prms.nServiceFnId,
nQueueId: prms.nQueueId
});
return res;
} catch (e) {
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
if (this.bConnected) {
//Проверяем структуру переданного объекта для подключения
let sCheckResult = checkObject(prms, {
fields: [
{ sName: "nLogState", bRequired: true },
{ sName: "sMsg", bRequired: false },
{ sName: "nServiceId", bRequired: false },
{ sName: "nServiceFnId", bRequired: false },
{ sName: "nQueueId", bRequired: false }
]
});
//Если структура объекта в норме
if (!sCheckResult) {
try {
let logData = { connection: this.connection };
_.extend(logData, prms);
let res = await this.connector.log(logData);
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(
glConst.SERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + sCheckResult
);
}
} else {
throw new ServerError(
glConst.ERR_OBJECT_BAD_INTERFACE,
"qqqОбъект имеет недопустимый интерфейс: " + checkResult
);
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
//Запись информации в журнал работы
async putLogInf(sMsg, prms) {
let logData = {};
_.extend(logData, prms);
logData.nLogState = NLOG_STATE_INF;
logData.sMsg = sMsg;
try {
let res = await this.putLog(logData);
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
}
//Запись предупреждения в журнал работы
async putLogWrn(sMsg, prms) {
let logData = {};
_.extend(logData, prms);
logData.nLogState = NLOG_STATE_WRN;
logData.sMsg = sMsg;
try {
let res = await this.putLog(logData);
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
}
//Запись ошибки в журнал работы
async putLogErr(sMsg, prms) {
let logData = {};
_.extend(logData, prms);
logData.nLogState = NLOG_STATE_ERR;
logData.sMsg = sMsg;
try {
let res = await this.putLog(logData);
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
}
//Считать очередную порцию исходящих сообщений
async getOutgoing(prms) {
//Проверяем структуру переданного объекта для подключения
let checkResult = checkObject(prms, {
fields: [{ name: "nPortionSize", required: true }]
});
//Если структура объекта в норме
if (!checkResult) {
try {
let res = await this.connector.getQueueOutgoing({
connection: this.connection,
nPortionSize: prms.nPortionSize
});
return res;
} catch (e) {
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
if (this.bConnected) {
//Проверяем структуру переданного объекта для подключения
let sCheckResult = checkObject(prms, {
fields: [{ sName: "nPortionSize", bRequired: true }]
});
//Если структура объекта в норме
if (!sCheckResult) {
try {
let res = await this.connector.getQueueOutgoing({
connection: this.connection,
nPortionSize: prms.nPortionSize
});
return res;
} catch (e) {
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(
glConst.SERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + sCheckResult
);
}
} else {
throw new ServerError(
glConst.ERR_OBJECT_BAD_INTERFACE,
"Объект имеет недопустимый интерфейс: " + checkResult
);
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
}
}
}

View File

@ -3,76 +3,141 @@
Модуль ядра: протоколирование работы
*/
//----------------------
// Подключение библиотек
//----------------------
const _ = require("lodash"); //Работа с массивами и объектами
const db = require("../core/db_connector.js"); //Модуль взаимодействия с БД
//------------
// Тело модуля
//------------
//Тип сообщения протокола - ошибка
const LOGGER_MESSAGE_TYPE_ERROR = "ERROR";
//Тип сообщения протокола - предупреждение
const LOGGER_MESSAGE_TYPE_WARN = "WARN";
//Тип сообщения протокола - информация
const LOGGER_MESSAGE_TYPE_INFO = "INFO";
//Типы сообщений протокола
const SLOGGER_MESSAGE_TYPE_ERROR = "ERROR"; // Ошибка
const SLOGGER_MESSAGE_TYPE_WARN = "WARN"; // Предупреждение
const SLOGGER_MESSAGE_TYPE_INFO = "INFO"; // Информация
//Сообщение протокола
class LoggerMessage {
//Конструктор класса
constructor(type, message) {
this.type = type;
this.message = message;
constructor(sType, sMessage, prms) {
this.sType = sType;
this.sMessage = sMessage;
if (prms) {
this.nServiceId = prms.nServiceId;
this.nServiceFnId = prms.nServiceFnId;
this.nQueueId = prms.nQueueId;
}
}
}
//Класс управления протоколом
class Logger {
//Конструктор класса
constructor() {}
//Протоколирование ошибки
error(msg) {
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_ERROR, msg));
constructor() {
this.dbConnector = "";
this.bLogDB = false;
}
//Протоколирование предупреждения
warn(msg) {
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_WARN, msg));
//Включение/выключение записи протоколов в БД
setLogDB(bLogDB) {
this.bLogDB = bLogDB;
}
//Протоколирование информации
info(msg) {
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_INFO, msg));
//Установка объекта для протоколирования в БД
setDBConnector(dbConnector) {
if (dbConnector instanceof db.DBConnector) {
this.dbConnector = dbConnector;
this.bLogDB = true;
}
}
//Протоколирование в БД
async logToDB(loggerMessage) {
//Если надо протоколировать и есть чем
console.log(this.dbConnector.bConnected);
console.log("DB LOGGER IN");
if (this.bLogDB && this.dbConnector && this.dbConnector.bConnected) {
//Если протоколируем стандартное сообщение
if (loggerMessage instanceof LoggerMessage) {
//Подготовим доп. сведения для протокола
let logData = {};
_.extend(logData, loggerMessage);
//Анализируем тип сообщения
switch (loggerMessage.sType) {
case SLOGGER_MESSAGE_TYPE_ERROR: {
await this.dbConnector.putLogErr(loggerMessage.sMessage, logData);
break;
}
case SLOGGER_MESSAGE_TYPE_WARN: {
await this.dbConnector.putLogWrn(loggerMessage.sMessage, logData);
break;
}
case SLOGGER_MESSAGE_TYPE_INFO: {
await this.dbConnector.putLogInf(loggerMessage.sMessage, logData);
break;
}
default:
await this.dbConnector.putLogInf(loggerMessage.sMessage, logData);
break;
}
} else {
//Для нестандартных - есдиный способ протоколирования
await this.dbConnector.putLogInf(loggerMessage);
}
}
console.log("DB LOGGER OUT");
}
//Протоколирование
log(loggerMessage) {
let message = "";
let prefix = "LOG MESSAGE";
let colorPattern = "";
async log(loggerMessage) {
let sMessage = "";
let sPrefix = "LOG MESSAGE";
let sColorPattern = "";
//Конструируем сообщение
if (loggerMessage instanceof LoggerMessage) {
switch (loggerMessage.type) {
case LOGGER_MESSAGE_TYPE_ERROR: {
prefix = "ERROR";
colorPattern = "\x1b[31m%s\x1b[0m%s";
switch (loggerMessage.sType) {
case SLOGGER_MESSAGE_TYPE_ERROR: {
sPrefix = "ERROR";
sColorPattern = "\x1b[31m%s\x1b[0m%s";
break;
}
case LOGGER_MESSAGE_TYPE_WARN: {
prefix = "WARNING";
colorPattern = "\x1b[33m%s\x1b[0m%s";
case SLOGGER_MESSAGE_TYPE_WARN: {
sPrefix = "WARNING";
sColorPattern = "\x1b[33m%s\x1b[0m%s";
break;
}
case LOGGER_MESSAGE_TYPE_INFO: {
prefix = "INFORMATION";
colorPattern = "\x1b[32m%s\x1b[0m%s";
case SLOGGER_MESSAGE_TYPE_INFO: {
sPrefix = "INFORMATION";
sColorPattern = "\x1b[32m%s\x1b[0m%s";
break;
}
default:
break;
}
message = loggerMessage.message;
sMessage = loggerMessage.sMessage;
} else {
message = loggerMessage;
sMessage = loggerMessage;
}
//Выдаём сообщение
console.log(colorPattern, prefix + ": ", message);
console.log(sColorPattern, sPrefix + ": ", sMessage);
//Протоколируем в БД, если это необходимо
if (this.bLogDB)
try {
await this.logToDB(loggerMessage);
} catch (e) {
console.log("LOGGER ERROR: " + e.sMessage);
}
}
//Протоколирование ошибки
async error(sMsg) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_ERROR, sMsg));
}
//Протоколирование предупреждения
async warn(sMsg) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_WARN, sMsg));
}
//Протоколирование информации
async info(sMsg) {
await this.log(new LoggerMessage(SLOGGER_MESSAGE_TYPE_INFO, sMsg));
}
}
@ -80,8 +145,8 @@ class Logger {
// Интерфейс модуля
//-----------------
exports.LOGGER_MESSAGE_TYPE_ERROR = LOGGER_MESSAGE_TYPE_ERROR;
exports.LOGGER_MESSAGE_TYPE_WARN = LOGGER_MESSAGE_TYPE_WARN;
exports.LOGGER_MESSAGE_TYPE_INFO = LOGGER_MESSAGE_TYPE_INFO;
exports.SLOGGER_MESSAGE_TYPE_ERROR = SLOGGER_MESSAGE_TYPE_ERROR;
exports.SLOGGER_MESSAGE_TYPE_WARN = SLOGGER_MESSAGE_TYPE_WARN;
exports.SLOGGER_MESSAGE_TYPE_INFO = SLOGGER_MESSAGE_TYPE_INFO;
exports.LoggerMessage = LoggerMessage;
exports.Logger = Logger;

View File

@ -10,9 +10,10 @@
//Общая ошибка системы
class ServerError extends Error {
//Конструктор
constructor(code, message) {
super(message);
this.code = code;
constructor(sCode, sMessage) {
super(sMessage);
this.sMessage = sMessage;
this.sCode = sCode;
}
}

View File

@ -7,63 +7,63 @@
// Подключение библиотек
//----------------------
const { MODULES_PATH_EX } = require("@core/constants.js"); //Глобавльные константы системы
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
//------------
// Тело модуля
//------------
//Проверка на функцию
const isFunction = functionToCheck => {
let fnStr = {}.toString.call(functionToCheck);
return functionToCheck && (fnStr === "[object Function]" || fnStr === "[object AsyncFunction]");
const isFunction = fnToCheck => {
let sFn = {}.toString.call(fnToCheck);
return fnToCheck && (sFn === "[object Function]" || sFn === "[object AsyncFunction]");
};
//Проверка объекта на наличие списка функций
const haveFunctions = (obj, list) => {
//Объявим результат
let res = true;
let bRes = true;
//Если есть что проверять
if (obj && list) {
//И если пришел массив наименований функций
if (Array.isArray(list)) {
list.forEach(fn => {
if (!isFunction(obj[fn])) res = false;
list.forEach(sFnName => {
if (!isFunction(obj[sFnName])) bRes = false;
});
} else {
res = false;
bRes = false;
}
} else {
res = false;
bRes = false;
}
//Вернем результат
return res;
return bRes;
};
//Проверка корректности интерфейса модуля
const checkModuleInterface = (module, interface) => {
//Объявим результат
let res = true;
let bRes = true;
//Если есть что проверять
if (module && interface) {
//Eсли есть список функций
if (interface.functions) {
//Проверим их наличие
res = haveFunctions(module, interface.functions);
bRes = haveFunctions(module, interface.functions);
} else {
res = false;
bRes = false;
}
} else {
res = false;
bRes = false;
}
//Вернем результат
return res;
return bRes;
};
//Проверка корректности полей объекта
const checkObject = (obj, interface) => {
//Объявим результат
let res = "";
let sRes = "";
//Если есть что проверять
if (obj && interface) {
//Eсли есть список полей для проверки
@ -74,41 +74,43 @@ const checkObject = (obj, interface) => {
//Обходим проверяемые поля
interface.fields.forEach(fld => {
//Проверим наличие поля в объекте (только для обязательных)
if (fld.required && !(fld.name in obj)) {
if (fld.bRequired && !(fld.sName in obj)) {
//Поля нет
noFields.push(fld.name);
noFields.push(fld.sName);
} else {
//Поле есть, проверим наличие значения
if (
fld.required &&
(obj[fld.name] === "undefined" || obj[fld.name] === null || obj[fld.name] === "")
fld.bRequired &&
(obj[fld.sName] === "undefined" || obj[fld.sName] === null || obj[fld.sName] === "")
)
//Обязательное поле не содержит значения
noValues.push(fld.name);
noValues.push(fld.sName);
}
});
//Сформируем итоговое сообщение
if (noFields.length > 0) res = "Объект не содержит полей: " + noFields.join(", ");
if (noFields.length > 0) sRes = "Объект не содержит полей: " + noFields.join(", ");
if (noValues.length > 0)
res +=
(res == "" ? "" : "; ") + "Обязательные поля объекта не имеют значений: " + noValues.join(", ");
sRes +=
(sRes == "" ? "" : "; ") +
"Обязательные поля объекта не имеют значений: " +
noValues.join(", ");
} else {
res = "Список проверяемых полей объекта не является массивом";
sRes = "Список проверяемых полей объекта не является массивом";
}
} else {
res = "Не указан список проверяемых полей объекта";
sRes = "Не указан список проверяемых полей объекта";
}
} else {
res = "Не указан проверяемый объект и/или его интерфейс";
sRes = "Не указан проверяемый объект и/или его интерфейс";
}
//Вернем результат
return res;
return sRes;
};
//Формирование полного пути к подключаемому модулю
const makeModuleFullPath = moduleName => {
if (moduleName) {
return MODULES_PATH_EX + "/" + moduleName;
const makeModuleFullPath = sModuleName => {
if (sModuleName) {
return SMODULES_PATH_EX + "/" + sModuleName;
} else {
return "";
}

4
index.js Normal file
View File

@ -0,0 +1,4 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Точка входа в сервер приложений
*/

View File

@ -134,7 +134,7 @@ const getServiceFunctions = prms => {
}
);
} else {
reject(new Error("Не указан идентификатор сервиса"));
reject(new Error("Не указан идентификатор сервиса (отсутствует поле: nServiceId)"));
}
} else {
reject(new Error("Не указано подключение (отсутствует поле: connection)"));

51
test.js
View File

@ -1,6 +1,6 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Точка входа в сервер приложений
Песочница для тестов
*/
//----------------------
@ -9,15 +9,54 @@
require("module-alias/register");
const cfg = require("./config.js");
const { Logger } = require("@core/logger.js");
const db = require("@core/db_connector.js");
const { ServerError } = require("@core/server_errors.js");
const utls = require("@core/utils.js");
const { Logger } = require("./core/logger.js");
const db = require("./core/db_connector.js");
const { ServerError } = require("./core/server_errors.js");
const utls = require("./core/utils.js");
//------------
// Тело модуля
//------------
const tests = async () => {
let a = new db.DBConnector(cfg.dbConnect);
let l = new Logger();
l.setDBConnector(a);
try {
//await l.warn("CONNECTING...");
await a.connect();
//await l.info("CONNECTED!");
//await l.warn("READING SERVICES...");
let srv = await a.getServices();
//await l.info(srv);
console.log("1");
await l.warn("DISCONNECTING...");
console.log("2");
await a.disconnect();
console.log("3");
await l.error("DISCONNECTED!");
console.log("4");
} catch (e) {
await l.error("DISCONNECTING ON ERROR: " + e.message + "...");
await a.disconnect();
await l.error("DISCONNECTED!");
throw e;
}
};
tests()
.then(r => {
if (r) console.log(r);
else console.log("SUCCESS!!!");
})
.catch(e => {
if (e instanceof ServerError) {
console.log("ServerError ERROR: " + e.sMessage);
} else {
console.log("ERROR: " + e.message);
}
});
/*
try {
let a = new db.DBConnector(cfg.dbConnect);
a.connect()
@ -32,7 +71,7 @@ try {
} else {
console.log("NO MESSAGES IN QUEUE!!!");
}
a.putLog({ nLogState: db.NLOG_STATE_INF, sMsg: "Сервер приложений подключен" })
a.putLogErr()
.then(res => {
console.log(res);
setTimeout(() => {