From ed4c6368da01fef937c87693df587b991da8822d Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 7 Dec 2018 21:17:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D1=85=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9-=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/utils.js | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/core/utils.js b/core/utils.js index 51fcb7e..e22c27d 100644 --- a/core/utils.js +++ b/core/utils.js @@ -9,7 +9,12 @@ const _ = require("lodash"); //Работа с массивами и объектами const Schema = require("validate"); //Схемы валидации -const { SERR_UNEXPECTED, SMODULES_PATH_MODULES } = require("./constants"); //Глобавльные константы системы +const { + SERR_UNEXPECTED, + SMODULES_PATH_MODULES, + SERR_MODULES_NO_MODULE_SPECIFIED, + SERR_MODULES_BAD_INTERFACE +} = require("./constants"); //Глобавльные константы системы const { ServerError } = require("./server_errors"); //Ошибка сервера //------------ @@ -64,6 +69,76 @@ const makeErrorText = e => { return sErr; }; +//Считывание наименования модуля-обработчика сервера приложений (ожидаемый формат - <МОДУЛЬ>/<ФУНКЦИЯ>) +const getAppSrvModuleName = sAppSrv => { + if (sAppSrv) { + if (sAppSrv instanceof String || typeof sAppSrv === "string") { + if (sAppSrv.indexOf("/") === -1) { + return null; + } else { + return sAppSrv.substring(0, sAppSrv.indexOf("/")); + } + } else { + return null; + } + } else { + return null; + } +}; + +//Считывание наименования функции модуля-обработчика сервера приложений (ожидаемый формат - <МОДУЛЬ>/<ФУНКЦИЯ>) +const getAppSrvFunctionName = sAppSrv => { + if (sAppSrv) { + if (sAppSrv instanceof String || typeof sAppSrv === "string") { + if (sAppSrv.indexOf("/") === -1) { + return null; + } else { + return sAppSrv.substring(sAppSrv.indexOf("/") + 1, sAppSrv.length); + } + } else { + return null; + } + } else { + return null; + } +}; + +//Получение функции обработчика +const getAppSrvFunction = sAppSrv => { + //Объявим формат (для сообщений об ошибках) + const sFormat = "(ожидаемый формат: <МОДУЛЬ>/<ФУНКЦИЯ>)"; + //Проверим, что есть что разбирать + if (!sAppSrv) + throw new ServerError(SERR_MODULES_NO_MODULE_SPECIFIED, `Не указаны модуль и функция обработчика ${sFormat}`); + //Разбираем + try { + //Разбираем на модуль и функцию + let moduleName = getAppSrvModuleName(sAppSrv); + let funcName = getAppSrvFunctionName(sAppSrv); + //Проверим, что есть и то и другое + if (!moduleName) throw Error(`Обработчик ${sAppSrv} не указывает на модуль ${sFormat}`); + if (!funcName) throw Error(`Обработчик ${sAppSrv} не указывает на функцию ${sFormat}`); + //Подключаем модуль + let mdl = null; + try { + mdl = require(makeModuleFullPath(moduleName)); + } catch (e) { + throw Error( + `Не удалось подключить модуль ${moduleName}, проверье что он существует и не имеет синтаксических ошибок. Ошибка подключения: ${ + e.message + }` + ); + } + //Проверяем, что в нём есть эта функция + if (!mdl[funcName]) throw Error(`Функция ${funcName} не определена в модуле ${moduleName}`); + //Проверяем, что функция асинхронна и если это так - возвращаем её + if ({}.toString.call(mdl[funcName]) === "[object AsyncFunction]") return mdl[funcName]; + else throw Error(`Функция ${funcName} модуля ${moduleName} должна быть асинхронной`); + } catch (e) { + throw new ServerError(SERR_MODULES_BAD_INTERFACE, e.message); + } +}; + //----------------- // Интерфейс модуля //----------------- @@ -71,3 +146,6 @@ const makeErrorText = e => { exports.validateObject = validateObject; exports.makeModuleFullPath = makeModuleFullPath; exports.makeErrorText = makeErrorText; +exports.getAppSrvModuleName = getAppSrvModuleName; +exports.getAppSrvFunctionName = getAppSrvFunctionName; +exports.getAppSrvFunction = getAppSrvFunction;