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})` + } + } +});