forked from CITKParus/P8-ExchangeService
Приведение всех простых идентификаторов к виду xName, где x - ссылкана тип данных, подключение логгера к БД
This commit is contained in:
parent
326565d3b4
commit
edda9c0e3b
@ -8,17 +8,17 @@
|
|||||||
//-----------------
|
//-----------------
|
||||||
|
|
||||||
//Путь к модулям
|
//Путь к модулям
|
||||||
exports.MODULES_PATH_CORE = "@core"; //Модули ядра
|
exports.SMODULES_PATH_CORE = "@core"; //Модули ядра
|
||||||
exports.MODULES_PATH_EX = "@modules"; //Дополнительные пользовательские модули
|
exports.SMODULES_PATH_EX = "@modules"; //Дополнительные пользовательские модули
|
||||||
|
|
||||||
//Типовые коды ошибок подключения модулей
|
//Типовые коды ошибок подключения модулей
|
||||||
exports.ERR_MODULES_NO_MODULE_SPECIFIED = "ERR_MODULES_NO_MODULE_SPECIFIED"; //Не указан подключаемый модуль
|
exports.SERR_MODULES_NO_MODULE_SPECIFIED = "ERR_MODULES_NO_MODULE_SPECIFIED"; //Не указан подключаемый модуль
|
||||||
exports.ERR_MODULES_BAD_INTERFACE = "ERR_MODULES_BAD_INTERFACE"; //Ошибочный интерфейс подключаемого модуля
|
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.SERR_DB_CONNECT = "ERR_DB_CONNECT"; //Ошибка подключения к БД
|
||||||
exports.ERR_DB_DISCONNECT = "ERR_DB_DISCONNECT"; //Ошибка отключения от БД
|
exports.SERR_DB_DISCONNECT = "ERR_DB_DISCONNECT"; //Ошибка отключения от БД
|
||||||
exports.ERR_DB_EXECUTE = "ERR_DB_EXECUTE"; //Ошибка исполнения функции в БД
|
exports.SERR_DB_EXECUTE = "ERR_DB_EXECUTE"; //Ошибка исполнения функции в БД
|
||||||
|
@ -8,9 +8,9 @@
|
|||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
const _ = require("lodash"); //Работа с массивами и объектами
|
const _ = require("lodash"); //Работа с массивами и объектами
|
||||||
const glConst = require("@core/constants.js"); //Глобальные константы
|
const glConst = require("../core/constants.js"); //Глобальные константы
|
||||||
const { checkModuleInterface, makeModuleFullPath, checkObject } = require("@core/utils.js"); //Вспомогательные функции
|
const { ServerError } = require("../core/server_errors.js"); //Типовая ошибка
|
||||||
const { ServerError } = require("@core/server_errors.js"); //Типовая ошибка
|
const { checkModuleInterface, makeModuleFullPath, checkObject } = require("../core/utils.js"); //Вспомогательные функции
|
||||||
|
|
||||||
//----------
|
//----------
|
||||||
// Константы
|
// Константы
|
||||||
@ -29,17 +29,17 @@ class DBConnector {
|
|||||||
//Конструктор
|
//Конструктор
|
||||||
constructor(prms) {
|
constructor(prms) {
|
||||||
//Проверяем структуру переданного объекта для подключения
|
//Проверяем структуру переданного объекта для подключения
|
||||||
let checkResult = checkObject(prms, {
|
let sCheckResult = checkObject(prms, {
|
||||||
fields: [
|
fields: [
|
||||||
{ name: "sUser", required: true },
|
{ sName: "sUser", bRequired: true },
|
||||||
{ name: "sPassword", required: true },
|
{ sName: "sPassword", bRequired: true },
|
||||||
{ name: "sConnectString", required: true },
|
{ sName: "sConnectString", bRequired: true },
|
||||||
{ name: "sSessionModuleName", required: true },
|
{ sName: "sSessionModuleName", bRequired: true },
|
||||||
{ name: "sConnectorModule", required: false }
|
{ sName: "sConnectorModule", bRequired: false }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
//Если структура объекта в норме
|
//Если структура объекта в норме
|
||||||
if (!checkResult) {
|
if (!sCheckResult) {
|
||||||
//Проверяем наличие модуля для работы с БД в настройках подключения
|
//Проверяем наличие модуля для работы с БД в настройках подключения
|
||||||
if (prms.sConnectorModule) {
|
if (prms.sConnectorModule) {
|
||||||
//Подключим модуль
|
//Подключим модуль
|
||||||
@ -60,7 +60,7 @@ class DBConnector {
|
|||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
throw new ServerError(
|
throw new ServerError(
|
||||||
glConst.ERR_MODULES_BAD_INTERFACE,
|
glConst.SERR_MODULES_BAD_INTERFACE,
|
||||||
"Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!"
|
"Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -69,121 +69,167 @@ class DBConnector {
|
|||||||
_.extend(this.connectSettings, prms);
|
_.extend(this.connectSettings, prms);
|
||||||
//Инициализируем остальные свойства
|
//Инициализируем остальные свойства
|
||||||
this.connection = {};
|
this.connection = {};
|
||||||
|
this.bConnected = false;
|
||||||
} else {
|
} else {
|
||||||
throw new ServerError(
|
throw new ServerError(
|
||||||
glConst.ERR_MODULES_NO_MODULE_SPECIFIED,
|
glConst.SERR_MODULES_NO_MODULE_SPECIFIED,
|
||||||
"Не указано имя подключаемого модуля-коннектора!"
|
"Не указано имя подключаемого модуля-коннектора!"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new ServerError(
|
throw new ServerError(
|
||||||
glConst.ERR_OBJECT_BAD_INTERFACE,
|
glConst.SERR_OBJECT_BAD_INTERFACE,
|
||||||
"Объект имеет недопустимый интерфейс: " + checkResult
|
"Объект имеет недопустимый интерфейс: " + sCheckResult
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Подключиться к БД
|
//Подключиться к БД
|
||||||
async connect() {
|
async connect() {
|
||||||
try {
|
try {
|
||||||
this.connection = await this.connector.connect({
|
this.connection = await this.connector.connect(this.connectSettings);
|
||||||
sUser: this.connectSettings.sUser,
|
this.bConnected = true;
|
||||||
sPassword: this.connectSettings.sPassword,
|
|
||||||
sConnectString: this.connectSettings.sConnectString,
|
|
||||||
sSessionModuleName: this.connectSettings.sSessionModuleName
|
|
||||||
});
|
|
||||||
return this.connection;
|
return this.connection;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new ServerError(glConst.ERR_DB_CONNECT, e.message);
|
throw new ServerError(glConst.SERR_DB_CONNECT, e.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Отключиться от БД
|
//Отключиться от БД
|
||||||
async disconnect() {
|
async disconnect() {
|
||||||
try {
|
if (this.bConnected) {
|
||||||
await this.connector.disconnect({ connection: this.connection });
|
try {
|
||||||
this.connection = {};
|
await this.connector.disconnect({ connection: this.connection });
|
||||||
return;
|
this.connection = {};
|
||||||
} catch (e) {
|
this.bConnected = false;
|
||||||
throw new ServerError(glConst.ERR_DB_DISCONNECT, e.message);
|
return;
|
||||||
|
} catch (e) {
|
||||||
|
throw new ServerError(glConst.SERR_DB_DISCONNECT, e.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Получить список сервисов
|
//Получить список сервисов
|
||||||
async getServices() {
|
async getServices() {
|
||||||
try {
|
if (this.bConnected) {
|
||||||
let srvs = await this.connector.getServices({ connection: this.connection });
|
try {
|
||||||
let srvsFuncs = srvs.map(async srv => {
|
let srvs = await this.connector.getServices({ connection: this.connection });
|
||||||
const response = await this.connector.getServiceFunctions({
|
let srvsFuncs = srvs.map(async srv => {
|
||||||
connection: this.connection,
|
const response = await this.connector.getServiceFunctions({
|
||||||
ddd: srv.NRN
|
connection: this.connection,
|
||||||
|
nServiceId: srv.nId
|
||||||
|
});
|
||||||
|
let tmp = {};
|
||||||
|
_.extend(tmp, srv, { functions: [] });
|
||||||
|
response.map(f => {
|
||||||
|
tmp.functions.push(f);
|
||||||
|
});
|
||||||
|
return tmp;
|
||||||
});
|
});
|
||||||
let tmp = {};
|
let res = await Promise.all(srvsFuncs);
|
||||||
_.extend(tmp, srv, { FN: [] });
|
return res;
|
||||||
response.map(f => {
|
} catch (e) {
|
||||||
tmp.FN.push(f);
|
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
|
||||||
});
|
}
|
||||||
return tmp;
|
} else {
|
||||||
});
|
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
|
||||||
let res = await Promise.all(srvsFuncs);
|
|
||||||
return res;
|
|
||||||
} catch (e) {
|
|
||||||
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Запись в журнал работы
|
//Запись в журнал работы
|
||||||
async putLog(prms) {
|
async putLog(prms) {
|
||||||
//Проверяем структуру переданного объекта для подключения
|
if (this.bConnected) {
|
||||||
let checkResult = checkObject(prms, {
|
//Проверяем структуру переданного объекта для подключения
|
||||||
fields: [
|
let sCheckResult = checkObject(prms, {
|
||||||
{ name: "nLogState", required: true },
|
fields: [
|
||||||
{ name: "sMsg", required: false },
|
{ sName: "nLogState", bRequired: true },
|
||||||
{ name: "nServiceId", required: false },
|
{ sName: "sMsg", bRequired: false },
|
||||||
{ name: "nServiceFnId", required: false },
|
{ sName: "nServiceId", bRequired: false },
|
||||||
{ name: "nQueueId", required: false }
|
{ sName: "nServiceFnId", bRequired: false },
|
||||||
]
|
{ sName: "nQueueId", bRequired: false }
|
||||||
});
|
]
|
||||||
//Если структура объекта в норме
|
});
|
||||||
if (!checkResult) {
|
//Если структура объекта в норме
|
||||||
try {
|
if (!sCheckResult) {
|
||||||
let res = await this.connector.log({
|
try {
|
||||||
connection: this.connection,
|
let logData = { connection: this.connection };
|
||||||
nLogState: prms.nLogState,
|
_.extend(logData, prms);
|
||||||
sMsg: prms.sMsg,
|
let res = await this.connector.log(logData);
|
||||||
nServiceId: prms.nServiceId,
|
return res;
|
||||||
nServiceFnId: prms.nServiceFnId,
|
} catch (e) {
|
||||||
nQueueId: prms.nQueueId
|
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
|
||||||
});
|
}
|
||||||
return res;
|
} else {
|
||||||
} catch (e) {
|
throw new ServerError(
|
||||||
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
|
glConst.SERR_OBJECT_BAD_INTERFACE,
|
||||||
|
"Объект имеет недопустимый интерфейс: " + sCheckResult
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new ServerError(
|
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
|
||||||
glConst.ERR_OBJECT_BAD_INTERFACE,
|
}
|
||||||
"qqqОбъект имеет недопустимый интерфейс: " + checkResult
|
}
|
||||||
);
|
//Запись информации в журнал работы
|
||||||
|
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) {
|
async getOutgoing(prms) {
|
||||||
//Проверяем структуру переданного объекта для подключения
|
if (this.bConnected) {
|
||||||
let checkResult = checkObject(prms, {
|
//Проверяем структуру переданного объекта для подключения
|
||||||
fields: [{ name: "nPortionSize", required: true }]
|
let sCheckResult = checkObject(prms, {
|
||||||
});
|
fields: [{ sName: "nPortionSize", bRequired: true }]
|
||||||
//Если структура объекта в норме
|
});
|
||||||
if (!checkResult) {
|
//Если структура объекта в норме
|
||||||
try {
|
if (!sCheckResult) {
|
||||||
let res = await this.connector.getQueueOutgoing({
|
try {
|
||||||
connection: this.connection,
|
let res = await this.connector.getQueueOutgoing({
|
||||||
nPortionSize: prms.nPortionSize
|
connection: this.connection,
|
||||||
});
|
nPortionSize: prms.nPortionSize
|
||||||
return res;
|
});
|
||||||
} catch (e) {
|
return res;
|
||||||
throw new ServerError(glConst.ERR_DB_EXECUTE, e.message);
|
} catch (e) {
|
||||||
|
throw new ServerError(glConst.SERR_DB_EXECUTE, e.message);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ServerError(
|
||||||
|
glConst.SERR_OBJECT_BAD_INTERFACE,
|
||||||
|
"Объект имеет недопустимый интерфейс: " + sCheckResult
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new ServerError(
|
throw new ServerError(glConst.SERR_DB_EXECUTE, "Нет подключения к БД");
|
||||||
glConst.ERR_OBJECT_BAD_INTERFACE,
|
|
||||||
"Объект имеет недопустимый интерфейс: " + checkResult
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
147
core/logger.js
147
core/logger.js
@ -3,76 +3,141 @@
|
|||||||
Модуль ядра: протоколирование работы
|
Модуль ядра: протоколирование работы
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//----------------------
|
||||||
|
// Подключение библиотек
|
||||||
|
//----------------------
|
||||||
|
|
||||||
|
const _ = require("lodash"); //Работа с массивами и объектами
|
||||||
|
const db = require("../core/db_connector.js"); //Модуль взаимодействия с БД
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
// Тело модуля
|
// Тело модуля
|
||||||
//------------
|
//------------
|
||||||
|
|
||||||
//Тип сообщения протокола - ошибка
|
//Типы сообщений протокола
|
||||||
const LOGGER_MESSAGE_TYPE_ERROR = "ERROR";
|
const SLOGGER_MESSAGE_TYPE_ERROR = "ERROR"; // Ошибка
|
||||||
|
const SLOGGER_MESSAGE_TYPE_WARN = "WARN"; // Предупреждение
|
||||||
//Тип сообщения протокола - предупреждение
|
const SLOGGER_MESSAGE_TYPE_INFO = "INFO"; // Информация
|
||||||
const LOGGER_MESSAGE_TYPE_WARN = "WARN";
|
|
||||||
|
|
||||||
//Тип сообщения протокола - информация
|
|
||||||
const LOGGER_MESSAGE_TYPE_INFO = "INFO";
|
|
||||||
|
|
||||||
//Сообщение протокола
|
//Сообщение протокола
|
||||||
class LoggerMessage {
|
class LoggerMessage {
|
||||||
//Конструктор класса
|
//Конструктор класса
|
||||||
constructor(type, message) {
|
constructor(sType, sMessage, prms) {
|
||||||
this.type = type;
|
this.sType = sType;
|
||||||
this.message = message;
|
this.sMessage = sMessage;
|
||||||
|
if (prms) {
|
||||||
|
this.nServiceId = prms.nServiceId;
|
||||||
|
this.nServiceFnId = prms.nServiceFnId;
|
||||||
|
this.nQueueId = prms.nQueueId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Класс управления протоколом
|
//Класс управления протоколом
|
||||||
class Logger {
|
class Logger {
|
||||||
//Конструктор класса
|
//Конструктор класса
|
||||||
constructor() {}
|
constructor() {
|
||||||
//Протоколирование ошибки
|
this.dbConnector = "";
|
||||||
error(msg) {
|
this.bLogDB = false;
|
||||||
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_ERROR, msg));
|
|
||||||
}
|
}
|
||||||
//Протоколирование предупреждения
|
//Включение/выключение записи протоколов в БД
|
||||||
warn(msg) {
|
setLogDB(bLogDB) {
|
||||||
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_WARN, msg));
|
this.bLogDB = bLogDB;
|
||||||
}
|
}
|
||||||
//Протоколирование информации
|
//Установка объекта для протоколирования в БД
|
||||||
info(msg) {
|
setDBConnector(dbConnector) {
|
||||||
this.log(new LoggerMessage(LOGGER_MESSAGE_TYPE_INFO, msg));
|
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) {
|
async log(loggerMessage) {
|
||||||
let message = "";
|
let sMessage = "";
|
||||||
let prefix = "LOG MESSAGE";
|
let sPrefix = "LOG MESSAGE";
|
||||||
let colorPattern = "";
|
let sColorPattern = "";
|
||||||
//Конструируем сообщение
|
//Конструируем сообщение
|
||||||
if (loggerMessage instanceof LoggerMessage) {
|
if (loggerMessage instanceof LoggerMessage) {
|
||||||
switch (loggerMessage.type) {
|
switch (loggerMessage.sType) {
|
||||||
case LOGGER_MESSAGE_TYPE_ERROR: {
|
case SLOGGER_MESSAGE_TYPE_ERROR: {
|
||||||
prefix = "ERROR";
|
sPrefix = "ERROR";
|
||||||
colorPattern = "\x1b[31m%s\x1b[0m%s";
|
sColorPattern = "\x1b[31m%s\x1b[0m%s";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LOGGER_MESSAGE_TYPE_WARN: {
|
case SLOGGER_MESSAGE_TYPE_WARN: {
|
||||||
prefix = "WARNING";
|
sPrefix = "WARNING";
|
||||||
colorPattern = "\x1b[33m%s\x1b[0m%s";
|
sColorPattern = "\x1b[33m%s\x1b[0m%s";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LOGGER_MESSAGE_TYPE_INFO: {
|
case SLOGGER_MESSAGE_TYPE_INFO: {
|
||||||
prefix = "INFORMATION";
|
sPrefix = "INFORMATION";
|
||||||
colorPattern = "\x1b[32m%s\x1b[0m%s";
|
sColorPattern = "\x1b[32m%s\x1b[0m%s";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
message = loggerMessage.message;
|
sMessage = loggerMessage.sMessage;
|
||||||
} else {
|
} 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.SLOGGER_MESSAGE_TYPE_ERROR = SLOGGER_MESSAGE_TYPE_ERROR;
|
||||||
exports.LOGGER_MESSAGE_TYPE_WARN = LOGGER_MESSAGE_TYPE_WARN;
|
exports.SLOGGER_MESSAGE_TYPE_WARN = SLOGGER_MESSAGE_TYPE_WARN;
|
||||||
exports.LOGGER_MESSAGE_TYPE_INFO = LOGGER_MESSAGE_TYPE_INFO;
|
exports.SLOGGER_MESSAGE_TYPE_INFO = SLOGGER_MESSAGE_TYPE_INFO;
|
||||||
exports.LoggerMessage = LoggerMessage;
|
exports.LoggerMessage = LoggerMessage;
|
||||||
exports.Logger = Logger;
|
exports.Logger = Logger;
|
||||||
|
@ -10,9 +10,10 @@
|
|||||||
//Общая ошибка системы
|
//Общая ошибка системы
|
||||||
class ServerError extends Error {
|
class ServerError extends Error {
|
||||||
//Конструктор
|
//Конструктор
|
||||||
constructor(code, message) {
|
constructor(sCode, sMessage) {
|
||||||
super(message);
|
super(sMessage);
|
||||||
this.code = code;
|
this.sMessage = sMessage;
|
||||||
|
this.sCode = sCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,63 +7,63 @@
|
|||||||
// Подключение библиотек
|
// Подключение библиотек
|
||||||
//----------------------
|
//----------------------
|
||||||
|
|
||||||
const { MODULES_PATH_EX } = require("@core/constants.js"); //Глобавльные константы системы
|
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
// Тело модуля
|
// Тело модуля
|
||||||
//------------
|
//------------
|
||||||
|
|
||||||
//Проверка на функцию
|
//Проверка на функцию
|
||||||
const isFunction = functionToCheck => {
|
const isFunction = fnToCheck => {
|
||||||
let fnStr = {}.toString.call(functionToCheck);
|
let sFn = {}.toString.call(fnToCheck);
|
||||||
return functionToCheck && (fnStr === "[object Function]" || fnStr === "[object AsyncFunction]");
|
return fnToCheck && (sFn === "[object Function]" || sFn === "[object AsyncFunction]");
|
||||||
};
|
};
|
||||||
|
|
||||||
//Проверка объекта на наличие списка функций
|
//Проверка объекта на наличие списка функций
|
||||||
const haveFunctions = (obj, list) => {
|
const haveFunctions = (obj, list) => {
|
||||||
//Объявим результат
|
//Объявим результат
|
||||||
let res = true;
|
let bRes = true;
|
||||||
//Если есть что проверять
|
//Если есть что проверять
|
||||||
if (obj && list) {
|
if (obj && list) {
|
||||||
//И если пришел массив наименований функций
|
//И если пришел массив наименований функций
|
||||||
if (Array.isArray(list)) {
|
if (Array.isArray(list)) {
|
||||||
list.forEach(fn => {
|
list.forEach(sFnName => {
|
||||||
if (!isFunction(obj[fn])) res = false;
|
if (!isFunction(obj[sFnName])) bRes = false;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
res = false;
|
bRes = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = false;
|
bRes = false;
|
||||||
}
|
}
|
||||||
//Вернем результат
|
//Вернем результат
|
||||||
return res;
|
return bRes;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Проверка корректности интерфейса модуля
|
//Проверка корректности интерфейса модуля
|
||||||
const checkModuleInterface = (module, interface) => {
|
const checkModuleInterface = (module, interface) => {
|
||||||
//Объявим результат
|
//Объявим результат
|
||||||
let res = true;
|
let bRes = true;
|
||||||
//Если есть что проверять
|
//Если есть что проверять
|
||||||
if (module && interface) {
|
if (module && interface) {
|
||||||
//Eсли есть список функций
|
//Eсли есть список функций
|
||||||
if (interface.functions) {
|
if (interface.functions) {
|
||||||
//Проверим их наличие
|
//Проверим их наличие
|
||||||
res = haveFunctions(module, interface.functions);
|
bRes = haveFunctions(module, interface.functions);
|
||||||
} else {
|
} else {
|
||||||
res = false;
|
bRes = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = false;
|
bRes = false;
|
||||||
}
|
}
|
||||||
//Вернем результат
|
//Вернем результат
|
||||||
return res;
|
return bRes;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Проверка корректности полей объекта
|
//Проверка корректности полей объекта
|
||||||
const checkObject = (obj, interface) => {
|
const checkObject = (obj, interface) => {
|
||||||
//Объявим результат
|
//Объявим результат
|
||||||
let res = "";
|
let sRes = "";
|
||||||
//Если есть что проверять
|
//Если есть что проверять
|
||||||
if (obj && interface) {
|
if (obj && interface) {
|
||||||
//Eсли есть список полей для проверки
|
//Eсли есть список полей для проверки
|
||||||
@ -74,41 +74,43 @@ const checkObject = (obj, interface) => {
|
|||||||
//Обходим проверяемые поля
|
//Обходим проверяемые поля
|
||||||
interface.fields.forEach(fld => {
|
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 {
|
} else {
|
||||||
//Поле есть, проверим наличие значения
|
//Поле есть, проверим наличие значения
|
||||||
if (
|
if (
|
||||||
fld.required &&
|
fld.bRequired &&
|
||||||
(obj[fld.name] === "undefined" || obj[fld.name] === null || obj[fld.name] === "")
|
(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)
|
if (noValues.length > 0)
|
||||||
res +=
|
sRes +=
|
||||||
(res == "" ? "" : "; ") + "Обязательные поля объекта не имеют значений: " + noValues.join(", ");
|
(sRes == "" ? "" : "; ") +
|
||||||
|
"Обязательные поля объекта не имеют значений: " +
|
||||||
|
noValues.join(", ");
|
||||||
} else {
|
} else {
|
||||||
res = "Список проверяемых полей объекта не является массивом";
|
sRes = "Список проверяемых полей объекта не является массивом";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = "Не указан список проверяемых полей объекта";
|
sRes = "Не указан список проверяемых полей объекта";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
res = "Не указан проверяемый объект и/или его интерфейс";
|
sRes = "Не указан проверяемый объект и/или его интерфейс";
|
||||||
}
|
}
|
||||||
//Вернем результат
|
//Вернем результат
|
||||||
return res;
|
return sRes;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Формирование полного пути к подключаемому модулю
|
//Формирование полного пути к подключаемому модулю
|
||||||
const makeModuleFullPath = moduleName => {
|
const makeModuleFullPath = sModuleName => {
|
||||||
if (moduleName) {
|
if (sModuleName) {
|
||||||
return MODULES_PATH_EX + "/" + moduleName;
|
return SMODULES_PATH_EX + "/" + sModuleName;
|
||||||
} else {
|
} else {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
4
index.js
Normal file
4
index.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/*
|
||||||
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
|
Точка входа в сервер приложений
|
||||||
|
*/
|
@ -134,7 +134,7 @@ const getServiceFunctions = prms => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
reject(new Error("Не указан идентификатор сервиса"));
|
reject(new Error("Не указан идентификатор сервиса (отсутствует поле: nServiceId)"));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
reject(new Error("Не указано подключение (отсутствует поле: connection)"));
|
reject(new Error("Не указано подключение (отсутствует поле: connection)"));
|
||||||
|
51
test.js
51
test.js
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Сервис интеграции ПП Парус 8 с WEB API
|
Сервис интеграции ПП Парус 8 с WEB API
|
||||||
Точка входа в сервер приложений
|
Песочница для тестов
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//----------------------
|
//----------------------
|
||||||
@ -9,15 +9,54 @@
|
|||||||
|
|
||||||
require("module-alias/register");
|
require("module-alias/register");
|
||||||
const cfg = require("./config.js");
|
const cfg = require("./config.js");
|
||||||
const { Logger } = require("@core/logger.js");
|
const { Logger } = require("./core/logger.js");
|
||||||
const db = require("@core/db_connector.js");
|
const db = require("./core/db_connector.js");
|
||||||
const { ServerError } = require("@core/server_errors.js");
|
const { ServerError } = require("./core/server_errors.js");
|
||||||
const utls = require("@core/utils.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 {
|
try {
|
||||||
let a = new db.DBConnector(cfg.dbConnect);
|
let a = new db.DBConnector(cfg.dbConnect);
|
||||||
a.connect()
|
a.connect()
|
||||||
@ -32,7 +71,7 @@ try {
|
|||||||
} else {
|
} else {
|
||||||
console.log("NO MESSAGES IN QUEUE!!!");
|
console.log("NO MESSAGES IN QUEUE!!!");
|
||||||
}
|
}
|
||||||
a.putLog({ nLogState: db.NLOG_STATE_INF, sMsg: "Сервер приложений подключен" })
|
a.putLogErr()
|
||||||
.then(res => {
|
.then(res => {
|
||||||
console.log(res);
|
console.log(res);
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user