Схемы валидаций функции сервиса, списка функций сервиса, сервиса, списка сервисов, небольшой рефакторинг схемы валидации параметров модуля взаимодействия с БД, удаление лишного из утилей, схема валидации интерфейса пользовательского модуля взаимодействия с БД

This commit is contained in:
Mikhail Chechnev 2018-11-23 21:21:47 +03:00
parent d062a0d32e
commit 875b11a01e
8 changed files with 445 additions and 115 deletions

View File

@ -9,10 +9,11 @@
const _ = require("lodash"); //Работа с массивами и объектами
const EventEmitter = require("events"); //Обработчик пользовательских событий
const dbConnSchemas = require("../models/prms_db_connector.js"); //Схемы валидации параметров
const glConst = require("../core/constants.js"); //Глобальные константы
const { ServerError } = require("../core/server_errors.js"); //Типовая ошибка
const { checkModuleInterface, makeModuleFullPath, checkObject, validateObject } = require("../core/utils.js"); //Вспомогательные функции
const glConst = require("../core/constants"); //Глобальные константы
const { ServerError } = require("../core/server_errors"); //Типовая ошибка
const { makeModuleFullPath, checkObject, validateObject } = require("../core/utils"); //Вспомогательные функции
const prmsDBConnectorSchema = require("../models/prms_db_connector.js"); //Схемы валидации параметров процедур модуля
const { intfDBConnectorModuleSchema } = require("../models/intf_db_connector_module"); //Схема валидации интерфейса модуля взаимодействия с БД
//----------
// Константы
@ -59,28 +60,16 @@ class DBConnector extends EventEmitter {
//Подключим модуль
this.connector = require(makeModuleFullPath(prms.sConnectorModule));
//Проверим его интерфейс
if (
!checkModuleInterface(this.connector, {
functions: [
"connect",
"disconnect",
"getServices",
"getServiceFunctions",
"log",
"getQueueOutgoing",
"putQueueIncoming",
"setQueueState"
]
})
) {
throw new ServerError(
glConst.SERR_MODULES_BAD_INTERFACE,
"Модуль " + prms.sConnectorModule + " реализует неверный интерфейс!"
);
let sCheckResult = validateObject(
this.connector,
intfDBConnectorModuleSchema,
"Модуль " + prms.sConnectorModule
);
if (sCheckResult) {
throw new ServerError(glConst.SERR_MODULES_BAD_INTERFACE, sCheckResult);
}
//Всё успешно - сохраним настройки подключения
this.connectSettings = {};
_.extend(this.connectSettings, prms);
this.connectSettings = _.cloneDeep(prms);
//Инициализируем остальные свойства
this.connection = {};
this.bConnected = false;
@ -132,9 +121,9 @@ class DBConnector extends EventEmitter {
connection: this.connection,
nServiceId: srv.nId
});
let tmp = {};
_.extend(tmp, srv, { functions: [] });
response.map(f => {
let tmp = _.cloneDeep(srv);
tmp.functions = [];
response.forEach(f => {
tmp.functions.push(f);
});
return tmp;
@ -252,7 +241,7 @@ class DBConnector extends EventEmitter {
async setQueueState(prms) {
if (this.bConnected) {
//Проверяем структуру переданных параметров
let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema);
let sCheckResult = validateObject(prms, prmsDBConnectorSchema.setQueueState);
//Если структура объекта в норме
if (!sCheckResult) {
//Подготовим параметры

View File

@ -7,73 +7,27 @@
// Подключение библиотек
//----------------------
const _ = require("lodash"); //Работа с массивами и объектами
const Schema = require("validate"); //Схемы валидации
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
const { SMODULES_PATH_EX } = require("../core/constants"); //Глобавльные константы системы
//------------
// Тело модуля
//------------
//Проверка на функцию
const isFunction = fnToCheck => {
let sFn = {}.toString.call(fnToCheck);
return fnToCheck && (sFn === "[object Function]" || sFn === "[object AsyncFunction]");
};
//Проверка объекта на наличие списка функций
const haveFunctions = (obj, list) => {
//Объявим результат
let bRes = true;
//Если есть что проверять
if (obj && list) {
//И если пришел массив наименований функций
if (Array.isArray(list)) {
list.forEach(sFnName => {
if (!isFunction(obj[sFnName])) bRes = false;
});
} else {
bRes = false;
}
} else {
bRes = false;
}
//Вернем результат
return bRes;
};
//Проверка корректности интерфейса модуля
const checkModuleInterface = (module, interface) => {
//Объявим результат
let bRes = true;
//Если есть что проверять
if (module && interface) {
//Eсли есть список функций
if (interface.functions) {
//Проверим их наличие
bRes = haveFunctions(module, interface.functions);
} else {
bRes = false;
}
} else {
bRes = false;
}
//Вернем результат
return bRes;
};
//Валидация объекта
const validateObject = (obj, schema, sObjName) => {
//Объявим результат
let sRes = "";
if (schema instanceof Schema) {
const errors = schema.validate(obj);
const objTmp = _.cloneDeep(obj);
const errors = schema.validate(objTmp, { strip: false });
if (errors && Array.isArray(errors)) {
if (errors.length > 0) {
let a = errors.map(e => {
return e.message;
});
sRes =
"Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; ");
sRes = (sObjName ? sObjName + " " : "Объект ") + "имеет некорректный формат: " + a.join("; ");
}
} else {
sRes = "Неожиданный ответ валидатора";
@ -145,9 +99,6 @@ const makeModuleFullPath = sModuleName => {
// Интерфейс модуля
//-----------------
exports.isFunction = isFunction;
exports.haveFunctions = haveFunctions;
exports.checkModuleInterface = checkModuleInterface;
exports.validateObject = validateObject;
exports.checkObject = checkObject;
exports.makeModuleFullPath = makeModuleFullPath;

View File

@ -8,6 +8,7 @@
//----------------------
const Schema = require("validate"); //Схемы валидации
const { defServiceFunctions } = require("../models/obj_service_functions");
//----------
// Константы
@ -40,7 +41,7 @@ exports.SUNAVLBL_NTF_SIGN_NO = SUNAVLBL_NTF_SIGN_NO;
exports.SUNAVLBL_NTF_SIGN_YES = SUNAVLBL_NTF_SIGN_YES;
//Схема валидации
exports.schema = new Schema({
exports.Service = new Schema({
//Идентификатор сервиса
nId: {
type: Number,
@ -59,42 +60,102 @@ exports.schema = new Schema({
required: "Не указан код сервиса (sCode)"
}
},
//Тип сервиса (числовой код)
//Тип сервиса
nSrvType: {
type: Number,
enum: [NSRV_TYPE_SEND, NSRV_TYPE_RECIVE],
required: true,
message: {
enum: "Значение числового кода типа сервиса (nSrvType) не поддерживается",
type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных",
required: "Не указан числовой код типа сервиса (nSrvType)"
type: "Тип сервиса (nSrvType) должен быть числом",
enum: "Значение типа сервиса (nSrvType) не поддерживается",
required: "Не указан типа сервиса (nSrvType)"
}
} /*,
},
//Тип сервиса (строковый код)
sSrvType: {
type: String,
enum: [SSRV_TYPE_SEND, SSRV_TYPE_RECIVE],
required: true,
message: {
type: "Строковый код типа сервиса (sSrvType) должен быть строкой",
enum: "Значение строкового кода типа сервиса (sSrvType) не поддерживается",
type: "Строковый код типа сервиса (sSrvType) имеет недопустимый тип данных",
required: "Не указан строковый код типа сервиса (sSrvType)"
}
},
//Корневой каталог сервиса
sSrvRoot: {}*/
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
//sSrvUser: {},
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
//sSrvPass: {},
//Признак необходимости оповещения о простое внешнего сервиса (числовой код)
//nUnavlblNtfSign: {},
sSrvRoot: {
type: String,
required: true,
message: {
type: "Корневой каталог сервиса (sSrvRoot) должен быть строкой",
required: "Не указан корневой каталог сервиса (sSrvRoot)"
}
},
//Имя пользователя сервиса
sSrvUser: {
type: String,
required: false,
message: {
type: "Имя пользователя сервиса (sSrvUser) должно быть строкой",
required: "Не указано имя пользователя сервиса (sSrvUser)"
}
},
//Пароль пользователя
sSrvPass: {
type: String,
required: false,
message: {
type: "Пароль пользователя сервиса (sSrvPass) должен быть строкой",
required: "Не указан пароль пользователя сервиса (sSrvPass)"
}
},
//Признак необходимости оповещения о простое внешнего сервиса
nUnavlblNtfSign: {
type: Number,
enum: [NUNAVLBL_NTF_SIGN_NO, NUNAVLBL_NTF_SIGN_YES],
required: true,
message: {
type: "Признак необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign) должен быть числом",
enum:
"Значение признака необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign) не поддерживается",
required: "Не указан признак необходимости оповещения о простое внешнего сервиса (nUnavlblNtfSign)"
}
},
//Признак необходимости оповещения о простое внешнего сервиса (строковый код)
//sUnavlblNtfSign: {},
sUnavlblNtfSign: {
type: String,
enum: [SUNAVLBL_NTF_SIGN_NO, SUNAVLBL_NTF_SIGN_YES],
required: true,
message: {
type:
"Строковый код признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign) должен быть строкой",
enum:
"Значение строкового кода признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign) не поддерживается",
required:
"Не указан строковый код признака необходимости оповещения о простое внешнего сервиса (sUnavlblNtfSign)"
}
},
//Максимальное время простоя (мин) удалённого сервиса для генерации оповещения
//nUnavlblNtfTime: {},
nUnavlblNtfTime: {
type: Number,
required: true,
message: {
type:
"Максимальное время простоя (мин) удалённого сервиса для генерации оповещения (nUnavlblNtfTime) должно быть числом",
required:
"Не указано максимальное время простоя (мин) удалённого сервиса для генерации оповещения (nUnavlblNtfTime)"
}
},
//Список адресов E-Mail для оповещения о простое внешнего сервиса
//sUnavlblNtfMail: {},
sUnavlblNtfMail: {
type: String,
required: false,
message: {
type:
"Список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail) должен быть строкой",
required: "Не указан список адресов E-Mail для оповещения о простое внешнего сервиса (sUnavlblNtfMail)"
}
},
//Список функций сервиса
//fn: {}
functions: defServiceFunctions(true, "functions")
});

View File

@ -0,0 +1,231 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: Описатель функции сервиса
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
//----------
// Константы
//----------
//Типы функций сервиса
const NFN_TYPE_DATA = 0; //Обмен данными
const NFN_TYPE_LOGIN = 1; //Начало сеанса
const NFN_TYPE_LOGOUT = 2; //Завершение сеанса
const SFN_TYPE_DATA = "DATA"; //Обмен данными (строковый код)
const SFN_TYPE_LOGIN = "LOGIN"; //Начало сеанса (строковый код)
const SFN_TYPE_LOGOUT = "LOGOUT"; //Завершение сеанса (строковый код)
//Способы передачи параметров функциям сервиса
const NFN_PRMS_TYPE_POST = 0; //POST-запрос
const NFN_PRMS_TYPE_GET = 1; //GET-запрос
const SFN_PRMS_TYPE_POST = "POST"; //POST-запрос
const SFN_PRMS_TYPE_GET = "GET"; //GET-запрос
//Расписание повторного исполнения функции
const NRETRY_SCHEDULE_UNDEF = 0; //Не определено
const NRETRY_SCHEDULE_SEC = 1; //Секунда
const NRETRY_SCHEDULE_MIN = 2; //Минута
const NRETRY_SCHEDULE_HOUR = 3; //Час
const NRETRY_SCHEDULE_DAY = 4; //Сутки
const NRETRY_SCHEDULE_WEEK = 5; //Неделя
const NRETRY_SCHEDULE_MONTH = 6; //Месяц
const SRETRY_SCHEDULE_UNDEF = "UNDEFINED"; //Не определено (строковый код)
const SRETRY_SCHEDULE_SEC = "SEC"; //Секунда (строковый код)
const SRETRY_SCHEDULE_MIN = "MIN"; //Минута (строковый код)
const SRETRY_SCHEDULE_HOUR = "HOUR"; //Час (строковый код)
const SRETRY_SCHEDULE_DAY = "DAY"; //Сутки (строковый код)
const SRETRY_SCHEDULE_WEEK = "WEEK"; //Неделя (строковый код)
const SRETRY_SCHEDULE_MONTH = "MONTH"; //Месяц (строковый код)
//------------------
// Интерфейс модуля
//------------------
//Константы
exports.NFN_TYPE_DATA = NFN_TYPE_DATA;
exports.NFN_TYPE_LOGIN = NFN_TYPE_LOGIN;
exports.NFN_TYPE_LOGOUT = NFN_TYPE_LOGOUT;
exports.SFN_TYPE_DATA = SFN_TYPE_DATA;
exports.SFN_TYPE_LOGIN = SFN_TYPE_LOGIN;
exports.SFN_TYPE_LOGOUT = SFN_TYPE_LOGOUT;
exports.NFN_PRMS_TYPE_POST = NFN_PRMS_TYPE_POST;
exports.NFN_PRMS_TYPE_GET = NFN_PRMS_TYPE_GET;
exports.SFN_PRMS_TYPE_POST = SFN_PRMS_TYPE_POST;
exports.SFN_PRMS_TYPE_GET = SFN_PRMS_TYPE_GET;
exports.NRETRY_SCHEDULE_UNDEF = NRETRY_SCHEDULE_UNDEF;
exports.NRETRY_SCHEDULE_SEC = NRETRY_SCHEDULE_SEC;
exports.NRETRY_SCHEDULE_MIN = NRETRY_SCHEDULE_MIN;
exports.NRETRY_SCHEDULE_HOUR = NRETRY_SCHEDULE_HOUR;
exports.NRETRY_SCHEDULE_DAY = NRETRY_SCHEDULE_DAY;
exports.NRETRY_SCHEDULE_WEEK = NRETRY_SCHEDULE_WEEK;
exports.NRETRY_SCHEDULE_MONTH = NRETRY_SCHEDULE_MONTH;
exports.SRETRY_SCHEDULE_UNDEF = SRETRY_SCHEDULE_UNDEF;
exports.SRETRY_SCHEDULE_SEC = SRETRY_SCHEDULE_SEC;
exports.SRETRY_SCHEDULE_MIN = SRETRY_SCHEDULE_MIN;
exports.SRETRY_SCHEDULE_HOUR = SRETRY_SCHEDULE_HOUR;
exports.SRETRY_SCHEDULE_DAY = SRETRY_SCHEDULE_DAY;
exports.SRETRY_SCHEDULE_WEEK = SRETRY_SCHEDULE_WEEK;
exports.SRETRY_SCHEDULE_MONTH = SRETRY_SCHEDULE_MONTH;
//Схема валидации функции сервиса
exports.ServiceFunction = new Schema({
//Идентификатор функции сервиса
nId: {
type: Number,
required: true,
message: {
type: "Идентификатор функции сервиса (nId) должен быть числом",
required: "Не указан идентификатор функции сервиса (nId)"
}
},
//Код функции сервиса
sCode: {
type: String,
required: true,
message: {
type: "Код функции сервиса (sCode) должен быть строкой",
required: "Не указан код функции сервиса (sCode)"
}
},
//Тип функции сервиса
nFnType: {
type: Number,
enum: [NFN_TYPE_DATA, NFN_TYPE_LOGIN, NFN_TYPE_LOGOUT],
required: true,
message: {
type: "Тип функции сервиса (nFnType) должен быть числом",
enum: "Значение типа функции сервиса (nFnType) не поддерживается",
required: "Не указан тип функции сервиса (nFnType)"
}
},
//Тип функции сервиса (строковый код)
sFnType: {
type: String,
enum: [SFN_TYPE_DATA, SFN_TYPE_LOGIN, SFN_TYPE_LOGOUT],
required: true,
message: {
type: "Строковый код типа функции сервиса (sFnType) должен быть строкой",
enum: "Значение строкового кода типа функции сервиса (sFnType) не поддерживается",
required: "Не указан строковый код типа функции сервиса (sFnType)"
}
},
//Адрес функции сервиса
sFnURL: {
type: String,
required: true,
message: {
type: "Адрес функции сервиса (sFnURL) должен быть строкой",
required: "Не указан адрес функции сервиса (sFnURL)"
}
},
//Способ передачи параметров функции сервиса
nFnPrmsType: {
type: Number,
enum: [NFN_PRMS_TYPE_GET, NFN_PRMS_TYPE_POST],
required: true,
message: {
type: "Способ передачи параметров функции сервиса (nFnPrmsType) должен быть числом",
enum: "Значение способа передачи параметров функции сервиса (nFnPrmsType) не поддерживается",
required: "Не указан способ передачи параметров функции сервиса (nFnPrmsType)"
}
},
//Способ передачи параметров функции сервиса (строковый код)
sFnPrmsType: {
type: String,
enum: [SFN_PRMS_TYPE_GET, SFN_PRMS_TYPE_POST],
required: true,
message: {
type: "Строковый код способа передачи параметров функции сервиса (sFnPrmsType) должен быть строкой",
enum:
"Значение строкового кода способа передачи параметров функции сервиса (sFnPrmsType) не поддерживается",
required: "Не указан строковый код способа передачи параметров функции сервиса (sFnPrmsType)"
}
},
//График повторной отправки запроса функции сервиса
nRetrySchedule: {
type: Number,
enum: [
NRETRY_SCHEDULE_UNDEF,
NRETRY_SCHEDULE_SEC,
NRETRY_SCHEDULE_MIN,
NRETRY_SCHEDULE_HOUR,
NRETRY_SCHEDULE_DAY,
NRETRY_SCHEDULE_WEEK,
NRETRY_SCHEDULE_MONTH
],
required: true,
message: {
type: "График повторной отправки запроса функции сервиса (nRetrySchedule) должен быть числом",
enum: "Значение графика повторной отправки запроса функции сервиса (nRetrySchedule) не поддерживается",
required: "Не указан график повторной отправки запроса функции сервиса (nRetrySchedule)"
}
},
//График повторной отправки запроса функции сервиса (строковый код)
sRetrySchedule: {
type: String,
enum: [
SRETRY_SCHEDULE_UNDEF,
SRETRY_SCHEDULE_SEC,
SRETRY_SCHEDULE_MIN,
SRETRY_SCHEDULE_HOUR,
SRETRY_SCHEDULE_DAY,
SRETRY_SCHEDULE_WEEK,
SRETRY_SCHEDULE_MONTH
],
required: true,
message: {
type:
"Строковый код графика повторной отправки запроса функции сервиса (sRetrySchedule) должен быть строкой",
enum:
"Значение строкового кода графика повторной отправки запроса функции сервиса (sRetrySchedule) не поддерживается",
required: "Не указан строковый код графика повторной отправки запроса функции сервиса (sRetrySchedule)"
}
},
//Идентификатор типового сообщения обмена, обрабатываемого функцией сервиса
nMsgId: {
type: Number,
required: true,
message: {
type:
"Идентификатор типового сообщения обмена, обрабатываемого функцией сервиса (nMsgId) должен быть числом",
required: "Не указан идентификатор типового сообщения обмена, обрабатываемого функцией сервиса (nMsgId)"
}
},
//Код типового сообщения обмена, обрабатываемого функцией сервиса
sMsgCode: {
type: String,
required: true,
message: {
type: "Код типового сообщения обмена, обрабатываемого функцией сервиса (sMsgCode) должен быть строкой",
required: "Не указан код типового сообщения обмена, обрабатываемого функцией сервиса (sMsgCode)"
}
},
//Обработчик сообщения "до" на строне сервера приложений для функции сервиса
sAppSrvBefore: {
type: String,
required: false,
message: {
type:
'Обработчик сообщения "до" на строне сервера приложений для функции сервиса (sAppSrvBefore) должен быть строкой',
required:
'Не указан обработчик сообщения "до" на строне сервера приложений для функции сервиса (sAppSrvBefore)'
}
},
//Обработчик сообщения "после" на строне сервера приложений для функции сервиса
sAppSrvAfter: {
type: String,
required: false,
message: {
type:
'Обработчик сообщения "после" на строне сервера приложений для функции сервиса (sAppSrvAfter) должен быть строкой',
required:
'Не указан обработчик сообщения "после" на строне сервера приложений для функции сервиса (sAppSrvBefore)'
}
}
});

View File

@ -0,0 +1,37 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: Описатель списка функций сервиса
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { ServiceFunction } = require("../models/obj_service_function"); //Схема валидации функции сервиса
//------------
// Тело модуля
//------------
//Описатель схемы валидации списка функций сервиса
const defServiceFunctions = (bRequired, sName) => {
return {
type: Array,
required: bRequired,
each: ServiceFunction,
message: {
required: "Не указан список функций сервиса (" + sName + ")"
}
};
};
//------------------
// Интерфейс модуля
//------------------
//Описатель схемы валидации списка функций сервиса
exports.defServiceFunctions = defServiceFunctions;
//Схема валидации списка функций сервиса
exports.ServiceFunctions = new Schema({ functions: defServiceFunctions(true, "functions") });

37
models/obj_services.js Normal file
View File

@ -0,0 +1,37 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: Описатель списка сервисов
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { Service } = require("../models/obj_service");
//------------
// Тело модуля
//------------
//Описатель схемы валидации списка сервисов
const defServices = (bRequired, sName) => {
return {
type: Array,
required: bRequired,
each: Service,
message: {
required: "Не указан список сервисов (" + sName + ")"
}
};
};
//------------------
// Интерфейс модуля
//------------------
//Описатель схемы валидации списка сервисов
exports.defServices = defServices;
//Схема валидации списка сервисов
exports.Services = new Schema({ services: defServices(true, "services") });

View File

@ -14,7 +14,7 @@ const Schema = require("validate"); //Схемы валидации
//------------------
//Схема валидации параметров установки состояния позиции очереди
exports.getQueueStatePrmsSchema = new Schema({
exports.setQueueState = new Schema({
//Идентификатор позиции очереди
nQueueId: {
type: Number,

52
test.js
View File

@ -4,8 +4,11 @@
*/
require("module-alias/register");
const srvsModel = require("./models/obj_services"); //Модель данных списка сервисов
const srvModel = require("./models/obj_service"); //Модель данных сервиса
const dbConnectorModel = require("./models/prms_db_connector"); //Модель данных сервиса
const srvFnModel = require("./models/obj_service_function"); //Модель данных функции сервиса
const srvFnSModel = require("./models/obj_service_functions"); //Модель данных функции сервиса
const dbConnectorModel = require("./models/prms_db_connector"); //Описатели параметров функций модуля подключения к БД
const dbConnectorInterfaceModel = require("./models/intf_db_connector_module"); //Интерфейс модуля взаимодействия с БД
const utl = require("./core/utils"); //Вспомогательные функции
const db = require("./core/db_connector"); //Взаимодействие с БД
@ -13,20 +16,41 @@ const cfg = require("./config"); //Настройки сервера прило
const pDB = require("./modules/parus_oracle_db");
let a = utl.validateObject(
{ nQueueId: 123, nExecState: 123, sExecMsg: "" },
dbConnectorModel.getQueueStatePrmsSchema,
"Тестовый"
);
console.log(a);
//let a = utl.validateObject(
// { nQueueId: 123, nExecState: 123, sExecMsg: "" },
// dbConnectorModel.getQueueStatePrmsSchema,
// "Тестовый"
//);
//console.log(a);
//let b = utl.validateObject(
// pDB,
// dbConnectorInterfaceModel.dbConnectorModule,
// "Пользовательский модуль подключения к БД"
//);
//if (b) console.log(b);
//else console.log("Нет ошибок в модуле");
const getServices = async () => {
let d = new db.DBConnector(cfg.dbConnect);
await d.connect();
r = await d.getServices();
await d.disconnect();
console.log(r);
let errs = utl.validateObject(r[1], srvModel.Service, "Сервис");
let errs2 = utl.validateObject({ functions: r[1].functions }, srvFnSModel.ServiceFunctions, "Функция сервиса");
let errs3 = utl.validateObject({ services: r }, srvsModel.Services, "Список сервисов");
console.log(r[1].functions[0]);
if (errs2) console.log(errs2);
else console.log("Нет ошибок в функции сервиса");
if (errs) console.log(errs);
else console.log("Нет ошибок в сервисе");
if (errs3) console.log(errs3);
else console.log("Нет ошибок в списке сервисов");
};
getServices();
let b = utl.validateObject(
pDB,
dbConnectorInterfaceModel.dbConnectorModule,
"Пользовательский модуль подключения к БД"
);
if (b) console.log(b);
else console.log("Нет ошибок в модуле");
/*
const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" });
console.log(errors);