From 078aa91aa62e27d8820c7fd0a84fba64c97c0f75 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 14 Jun 2019 21:47:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=D0=B0=20XML,=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20(XML=20>=20JSON,=20JSON=20>=20XML)=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=BE=D1=82=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/utils.js | 78 +++++++++++++++++++++++++++++++------------- models/prms_utils.js | 50 ++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 23 deletions(-) diff --git a/core/utils.js b/core/utils.js index a1e9194..ac6755d 100644 --- a/core/utils.js +++ b/core/utils.js @@ -174,7 +174,7 @@ const getAppSrvFunction = sAppSrv => { //Отправка E-Mail уведомления const sendMail = prms => { return new Promise((resolve, reject) => { - //Проверяем структуру переданного объекта для старта + //Проверяем структуру переданного объекта для отправки E-Mail уведомления let sCheckResult = validateObject( prms, prmsUtilsSchema.sendMail, @@ -224,7 +224,7 @@ const sendMail = prms => { //Сборка URL по адресу сервиса и функции сервиса const buildURL = prms => { - //Проверяем структуру переданного объекта для старта + //Проверяем структуру переданного объекта для сборки URL let sCheckResult = validateObject(prms, prmsUtilsSchema.buildURL, "Параметры функции формирования URL"); //Если структура объекта в норме if (!sCheckResult) { @@ -254,36 +254,68 @@ const getIPs = () => { }; //Разбор XML (обёртка для async/await) -const parseXML = (sXML, options) => { +const parseXML = prms => { return new Promise((resolve, reject) => { - xml2js.parseString(sXML, options, (err, result) => { - if (err) reject(err); - else resolve(result); - }); + //Проверяем структуру переданного объекта для парсинша + let sCheckResult = validateObject(prms, prmsUtilsSchema.parseXML, "Параметры функции разбора XML"); + //Если структура объекта в норме + if (!sCheckResult) { + xml2js.parseString(prms.sXML, prms.options, (err, result) => { + if (err) reject(err); + else resolve(result); + }); + } else { + reject(new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult)); + } }); }; //Разбор параметров сообщения/ответа (XML > JSON) -const parseOptionsXML = async sOptions => { - try { - parseRes = await parseXML(sOptions, { - explicitArray: false, - mergeAttrs: true, - valueProcessors: [xml2js.processors.parseNumbers, xml2js.processors.parseBooleans] - }); - return parseRes.options; - } catch (e) { - throw new Error("Ошибка рабора XML с параметрами сообщения/ответа: " + e); +const parseOptionsXML = async prms => { + //Проверяем структуру переданных параметров + let sCheckResult = validateObject( + prms, + prmsUtilsSchema.parseOptionsXML, + "Параметры функции разбора XML параметров сообщения/ответа" + ); + //Если структура объекта в норме + if (!sCheckResult) { + try { + parseRes = await parseXML({ + sXML: prms.sOptions, + options: { + explicitArray: false, + mergeAttrs: true, + valueProcessors: [xml2js.processors.parseNumbers, xml2js.processors.parseBooleans] + } + }); + return parseRes.root; + } catch (e) { + throw new Error("Ошибка рабора XML с параметрами сообщения/ответа: " + e); + } + } else { + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } }; //Сборка параметров сообщения/ответа (JSON > XML) -const buildOptionsXML = options => { - try { - let builder = new xml2js.Builder(); - return builder.buildObject(options); - } catch (e) { - throw new Error("Ошибка сборки XML с параметрами сообщения/ответа: " + e); +const buildOptionsXML = prms => { + //Проверяем структуру переданных параметров + let sCheckResult = validateObject( + prms, + prmsUtilsSchema.buildOptionsXML, + "Параметры функции сборки XML параметров сообщения/ответа" + ); + //Если структура объекта в норме + if (!sCheckResult) { + try { + let builder = new xml2js.Builder(); + return builder.buildObject({ root: prms.options }); + } catch (e) { + throw new Error("Ошибка сборки XML с параметрами сообщения/ответа: " + e); + } + } else { + throw new ServerError(SERR_OBJECT_BAD_INTERFACE, sCheckResult); } }; diff --git a/models/prms_utils.js b/models/prms_utils.js index 7767575..fadf9ef 100644 --- a/models/prms_utils.js +++ b/models/prms_utils.js @@ -97,3 +97,53 @@ exports.buildURL = new Schema({ } } }); + +//Схема валидации параметров функции разбора XML +exports.parseXML = new Schema({ + //Разбираемый XML + sXML: { + type: String, + required: true, + message: { + type: path => `Разбираемый XML (${path}) имеет некорректный тип данных (ожидалось - String)`, + required: path => `Не указан разбираемый XML (${path})` + } + }, + //Параметры парсера + options: { + type: Object, + required: true, + message: { + type: path => + `Параметры парсера XML (${path}) имеют некорректный тип данных (ожидалось - Object, см. документацию к XML2JS - https://github.com/Leonidas-from-XIV/node-xml2js)`, + required: path => `Не указаны параметры парсера XML (${path})` + } + } +}); + +//Схема валидации параметров функции разбора XML параметров сообщения/ответа (XML > JSON) +exports.parseOptionsXML = new Schema({ + //XML параметры сообщения/ответа + sOptions: { + type: String, + required: true, + message: { + type: path => `XML параметры сообщения/ответа (${path}) имеют некорректный тип данных (ожидалось - String)`, + required: path => `Не указаны XML параметры сообщения/ответа (${path})` + } + } +}); + +//Схема валидации параметров функции сборки параметров сообщения/ответа (JSON > XML) +exports.buildOptionsXML = new Schema({ + //XML параметры сообщения/ответа + options: { + type: Object, + required: true, + message: { + type: path => + `Объект параметров сообщения/ответа (${path}) имеет некорректный тип данных (ожидалось - Object)`, + required: path => `Не указан объект параметров сообщения/ответа (${path})` + } + } +});