diff --git a/core/in_queue.js b/core/in_queue.js index 6adfe8a..2649818 100644 --- a/core/in_queue.js +++ b/core/in_queue.js @@ -10,6 +10,7 @@ const _ = require("lodash"); //Работа с массивами и коллекциями const EventEmitter = require("events"); //Обработчик пользовательских событий const express = require("express"); //WEB-сервер Express +const cors = require("cors"); //Управление заголовками безопасности для WEB-сервера Express const bodyParser = require("body-parser"); //Модуль для Express (разбор тела входящего запроса) const { ServerError } = require("./server_errors"); //Типовая ошибка const { @@ -71,6 +72,8 @@ class InQueue extends EventEmitter { this.notifier = prms.notifier; //WEB-приложение this.webApp = express(); + this.webApp.use(cors()); + this.webApp.options("*", cors()); //WEB-сервер this.srv = null; } else { @@ -309,9 +312,7 @@ class InQueue extends EventEmitter { await this.logger.info(`Входящее сообщение ${q.nId} успешно отработано`, { nQueueId: q.nId }); } catch (e) { //Тема и текст уведомления об ошибке - let sSubject = `Ошибка обработки входящего сообщения сервером приложений для функции "${ - prms.function.sCode - }" сервиса "${prms.service.sCode}"`; + let sSubject = `Ошибка обработки входящего сообщения сервером приложений для функции "${prms.function.sCode}" сервиса "${prms.service.sCode}"`; let sMessage = makeErrorText(e); //Если сообщение очереди успели создать if (q) { @@ -328,9 +329,7 @@ class InQueue extends EventEmitter { { nQueueId: q.nId } ); //Добавим чуть больше информации в тему сообщения - sSubject = `Ошибка обработки входящего сообщения ${q.nId} сервером приложений для функции "${ - prms.function.sCode - }" сервиса "${prms.service.sCode}"`; + sSubject = `Ошибка обработки входящего сообщения ${q.nId} сервером приложений для функции "${prms.function.sCode}" сервиса "${prms.service.sCode}"`; } else { //Ограничимся общей ошибкой await this.logger.error(sMessage, { @@ -375,52 +374,56 @@ class InQueue extends EventEmitter { //Для любых запросов к корневому адресу сервиса - ответ о том, что это за сервис, и что он работает this.webApp.all(srvs.sSrvRoot, (req, res) => { res.status(200).send( - `

Сервер приложений ПП Парус 8

Сервис: ${ - srvs.sName - }

` + `

Сервер приложений ПП Парус 8

Сервис: ${srvs.sName}

` ); }); //Для всех статических функций сервиса... - _.forEach(_.filter(srvs.functions, fn => fn.sFnURL.startsWith("@")), fn => { - this.webApp.use( - buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL.substr(1) }), - express.static(`${this.inComing.sStaticDir}/${fn.sFnURL.substr(1)}`) - ); - }); + _.forEach( + _.filter(srvs.functions, fn => fn.sFnURL.startsWith("@")), + fn => { + this.webApp.use( + buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL.substr(1) }), + express.static(`${this.inComing.sStaticDir}/${fn.sFnURL.substr(1)}`) + ); + } + ); //Для всех функций сервиса (кроме статических)... - _.forEach(_.filter(srvs.functions, fn => !fn.sFnURL.startsWith("@")), fn => { - //...собственный обработчик, в зависимости от указанного способа передачи параметров - this.webApp[fn.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST ? "post" : "get"]( - buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), - async (req, res) => { - try { - //Вызываем обработчик - await this.processMessage({ req, res, service: srvs, function: fn }); - } catch (e) { + _.forEach( + _.filter(srvs.functions, fn => !fn.sFnURL.startsWith("@")), + fn => { + //...собственный обработчик, в зависимости от указанного способа передачи параметров + this.webApp[fn.nFnPrmsType == objServiceFnSchema.NFN_PRMS_TYPE_POST ? "post" : "get"]( + buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), + async (req, res) => { + try { + //Вызываем обработчик + await this.processMessage({ req, res, service: srvs, function: fn }); + } catch (e) { + //Протоколируем в журнал работы сервера + await this.logger.error(makeErrorText(e), { + nServiceId: srvs.nId, + nServiceFnId: fn.nId + }); + //Отправим ошибку клиенту + res.status(500).send(makeErrorText(e)); + } + } + ); + //...и собственный обработчик ошибок + this.webApp.use( + buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), + async (err, req, res, next) => { //Протоколируем в журнал работы сервера - await this.logger.error(makeErrorText(e), { + await this.logger.error(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message)), { nServiceId: srvs.nId, nServiceFnId: fn.nId }); //Отправим ошибку клиенту - res.status(500).send(makeErrorText(e)); + res.status(500).send(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message))); } - } - ); - //...и собственный обработчик ошибок - this.webApp.use( - buildURL({ sSrvRoot: srvs.sSrvRoot, sFnURL: fn.sFnURL }), - async (err, req, res, next) => { - //Протоколируем в журнал работы сервера - await this.logger.error(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message)), { - nServiceId: srvs.nId, - nServiceFnId: fn.nId - }); - //Отправим ошибку клиенту - res.status(500).send(makeErrorText(new ServerError(SERR_WEB_SERVER, err.message))); - } - ); - }); + ); + } + ); }); //Запросы на адреса, не входящие в состав объявленных сервисов - 404 NOT FOUND this.webApp.use("*", (req, res) => { diff --git a/package-lock.json b/package-lock.json index 1e72b74..9c25477 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,6 +135,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -407,9 +416,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "media-typer": { "version": "0.3.0", @@ -469,6 +478,11 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", diff --git a/package.json b/package.json index 8934533..d66dcde 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,10 @@ "homepage": "https://github.com/CITKParus/ExchangeService#readme", "dependencies": { "body-parser": "^1.18.3", + "cors": "^2.8.5", "express": "^4.16.4", "js2xmlparser": "^3.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "module-alias": "^2.1.0", "nodemailer": "^4.7.0", "oracledb": "^2.3.0",