Внедрение валидатора (часть первая)

This commit is contained in:
Mikhail Chechnev 2018-11-21 22:13:13 +03:00
parent 3855aad2c9
commit 9525bb8609
7 changed files with 190 additions and 35 deletions

View File

@ -9,9 +9,10 @@
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 } = require("../core/utils.js"); //Вспомогательные функции
const { checkModuleInterface, makeModuleFullPath, checkObject, validateObject } = require("../core/utils.js"); //Вспомогательные функции
//----------
// Константы
@ -35,6 +36,7 @@ const SEVT_DB_CONNECTOR_DISCONNECTED = "DB_CONNECTOR_DISCONNECTED"; //Отклю
// Тело модуля
//------------
//Класс для взаимодействия с БД
class DBConnector extends EventEmitter {
//Конструктор
constructor(prms) {
@ -249,26 +251,23 @@ class DBConnector extends EventEmitter {
//Установить состояние позиции очереди
async setQueueState(prms) {
if (this.bConnected) {
//Проверяем структуру переданного объекта для подключения
//let sCheckResult = checkObject(prms, {
// fields: [{ sName: "nPortionSize", bRequired: true }]
//});
//Проверяем структуру переданных параметров
let sCheckResult = validateObject(prms, dbConnSchemas.getQueueStatePrmsSchema);
//Если структура объекта в норме
//if (!sCheckResult) {
let setStateData = { connection: this.connection };
_.extend(setStateData, prms);
try {
let res = await this.connector.setQueueState(setStateData);
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
if (!sCheckResult) {
//Подготовим параметры
let setStateData = { connection: this.connection };
_.extend(setStateData, prms);
//Исполняем действие в БД
try {
let res = await this.connector.setQueueState(setStateData);
return res;
} catch (e) {
throw new ServerError(SERR_DB_EXECUTE, e.message);
}
} else {
throw new ServerError(glConst.SERR_OBJECT_BAD_INTERFACE, sCheckResult);
}
//} else {
// throw new ServerError(
// glConst.SERR_OBJECT_BAD_INTERFACE,
// "Объект имеет недопустимый интерфейс: " + sCheckResult
// );
//}
} else {
throw new ServerError(SERR_DB_EXECUTE, "Нет подключения к БД");
}

View File

@ -7,6 +7,7 @@
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
const { SMODULES_PATH_EX } = require("../core/constants.js"); //Глобавльные константы системы
//------------
@ -60,6 +61,30 @@ const checkModuleInterface = (module, interface) => {
return bRes;
};
//Валидация объекта
const validateObject = (obj, schema, sObjName) => {
//Объявим результат
let sRes = "";
if (schema instanceof Schema) {
const errors = schema.validate(obj);
if (errors && Array.isArray(errors)) {
if (errors.length > 0) {
let a = errors.map(e => {
return e.message;
});
sRes =
"Объект" + (sObjName ? " '" + sObjName + "' " : " ") + "имеет некорректный формат: " + a.join("; ");
}
} else {
sRes = "Неожиданный ответ валидатора";
}
} else {
sRes = "Ошибочный формат схемы валидации";
}
//Вернем результат
return sRes;
};
//Проверка корректности полей объекта
const checkObject = (obj, interface) => {
//Объявим результат
@ -123,5 +148,6 @@ const makeModuleFullPath = sModuleName => {
exports.isFunction = isFunction;
exports.haveFunctions = haveFunctions;
exports.checkModuleInterface = checkModuleInterface;
exports.validateObject = validateObject;
exports.checkObject = checkObject;
exports.makeModuleFullPath = makeModuleFullPath;

View File

@ -0,0 +1,60 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: Описатель интерфейса подключаемого модуля взаимодействия с БД
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
//------------------
// Интерфейс модуля
//------------------
/*
"getServiceFunctions",
"log",
"getQueueOutgoing",
"putQueueIncoming",
"setQueueState"
*/
const validateFunctionType = val => {
let sFn = {}.toString.call(val);
console.log(sFn);
return sFn === "[object Function]" || sFn === "[object AsyncFunction]";
};
//Схема валидации подключаемого модуля взаимодействия с БД
exports.dbConnectorModule = new Schema({
//Функция подключения к БД
connect: {
use: { validateFunctionType },
required: true,
message: {
validateFunctionType: "Функция подключения к БД (connect) имеет неверный формат",
required: "Не реализована функция подключения к БД (connect)"
}
},
//Функция отключения от БД
disconnect: {
type: Function,
required: true,
message: {
type: "Функция отключения от БД (disconnect) имеет неверный формат",
required: "Не реализована функция отключения от БД (disconnect)"
}
},
//Функция получения данных о сервисах
getServices: {
type: Function,
required: true,
message: {
type: "Функция получения данных сервисов (getServices) имеет неверный формат",
required: "Не реализована функция получения данных сервисов (getServices)"
}
}
});

View File

@ -69,7 +69,7 @@ exports.schema = new Schema({
type: "Числовой код типа сервиса (nSrvType) имеет недопустимый тип данных",
required: "Не указан числовой код типа сервиса (nSrvType)"
}
},
} /*,
//Тип сервиса (строковый код)
sSrvType: {
type: String,
@ -82,7 +82,7 @@ exports.schema = new Schema({
}
},
//Корневой каталог сервиса
sSrvRoot: {}
sSrvRoot: {}*/
//Имя пользователя (для аутентификации на внешнем сервисе при отправке сообщений)
//sSrvUser: {},
//Пароль пользователя (для аутентификации на внешнем сервисе при отправке сообщений)

View File

@ -0,0 +1,46 @@
/*
Сервис интеграции ПП Парус 8 с WEB API
Модели данных: Описатели параметров процедур модуля взаимодействия с БД (класс DBConnector)
*/
//----------------------
// Подключение библиотек
//----------------------
const Schema = require("validate"); //Схемы валидации
//------------------
// Интерфейс модуля
//------------------
//Схема валидации параметров установки состояния позиции очереди
exports.getQueueStatePrmsSchema = new Schema({
//Идентификатор позиции очереди
nQueueId: {
type: Number,
required: true,
message: {
type: "Идентификатор позиции очереди (nQueueId) должен быть числом",
required: "Не указан идентификатор позиции очереди (nQueueId)"
}
},
//Код состояния
nExecState: {
type: Number,
enum: [1, 2], //!!!!!!!!!!!!!!!!!!!!!!
required: true,
message: {
type: "Код состояния (nExecState) должен быть числовым",
enum: "Указанный код состояния (nExecState) не поддерживается",
required: "Не указан код состояния (nExecState)"
}
},
//Сообщение обработчика
sExecMsg: {
type: String,
required: false,
message: {
type: "Сообщение обработчика (sExecMsg) должно быть строкой"
}
}
});

View File

@ -25,6 +25,7 @@
},
"_moduleAliases": {
"@core": "core",
"@modules": "modules"
"@modules": "modules",
"@models": "models"
}
}

49
test.js
View File

@ -4,14 +4,31 @@
*/
require("module-alias/register");
const srvModel = require("./models/service");
const db = require("./core/db_connector.js"); //Взаимодействие с БД
const cfg = require("./config.js"); //Настройки сервера приложений
const srvModel = require("./models/obj_service"); //Модель данных сервиса
const dbConnectorModel = require("./models/prms_db_connector"); //Модель данных сервиса
const dbConnectorInterfaceModel = require("./models/interface_db_connector_module"); //Интерфейс модуля взаимодействия с БД
const utl = require("./core/utils"); //Вспомогательные функции
const db = require("./core/db_connector"); //Взаимодействие с БД
const cfg = require("./config"); //Настройки сервера приложений
//const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" });
//errors.forEach(e => {
//console.log(e.message);
//});
const pDB = require("./modules/parus_oracle_db");
let a = utl.validateObject(
{ nQueueId: 123, nExecState: 123, sExecMsg: "" },
dbConnectorModel.getQueueStatePrmsSchema,
"Тестовый"
);
console.log(a);
let b = utl.validateObject(pDB, dbConnectorInterfaceModel.dbConnectorModule);
console.log(b);
/*
const errors = srvModel.schema.validate({ nId: 123, sCode: "", nSrvType: "", sSrvType: "" });
console.log(errors);
let a = errors.map(e => {
return e.message;
});
console.log(a.join("; "));
const dbConn = new db.DBConnector(cfg.dbConnect);
@ -19,13 +36,19 @@ const test = async () => {
await dbConn.connect();
let r = await dbConn.getOutgoing({ nPortionSize: 123 });
console.log(r);
let rr = await dbConn.setQueueState({
nQueueId: 94568140,
nExecState: 1,
sExecMsg: "Обработано сервером приложений"
});
console.log(rr);
try {
let rr = await dbConn.setQueueState({
nQueueId: 94568140,
nExecState: 1,
sExecMsg: "Обработано сервером приложений"
});
console.log(rr);
} catch (e) {
console.log(e.sMessage);
}
await dbConn.disconnect();
};
test();
*/