Приведение всех простых идентификаторов к виду xName, где x - ссылкана тип данных, подключение логгера к БД
This commit is contained in:
parent
326565d3b4
commit
edda9c0e3b
@ -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"; //Ошибка исполнения функции в БД
|
||||
|
@ -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, "Нет подключения к БД");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
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 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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
4
index.js
Normal file
@ -0,0 +1,4 @@
|
||||
/*
|
||||
Сервис интеграции ПП Парус 8 с WEB API
|
||||
Точка входа в сервер приложений
|
||||
*/
|
@ -134,7 +134,7 @@ const getServiceFunctions = prms => {
|
||||
}
|
||||
);
|
||||
} else {
|
||||
reject(new Error("Не указан идентификатор сервиса"));
|
||||
reject(new Error("Не указан идентификатор сервиса (отсутствует поле: nServiceId)"));
|
||||
}
|
||||
} else {
|
||||
reject(new Error("Не указано подключение (отсутствует поле: connection)"));
|
||||
|
51
test.js
51
test.js
@ -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(() => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user