80 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Сервис интеграции ПП Парус 8 с WEB API
Дополнительный модуль: Parus WEB Service (PWS)
*/
//----------------------
// Подключение библиотек
//----------------------
const _ = require("lodash"); //Работа с массивами и коллекциями
const xmlParser = require("xml2js").parseString; //Конвертация XML в JSON
const js2xmlparser = require("js2xmlparser"); //Конвертация JSON в XML
//---------------------
// Глобальные константы
//---------------------
//Наименования XML-элементов
const SREQUEST_ROOT = "XREQUEST"; //Корневой элемент XML-представления входящего запроса
//Поля заголовка сообщения
const SHEADER_CONTENT_TYPE_JSON = "application/json"; //Значение "content-type" для JSON
//------------
// Тело модуля
//------------
//Разбор XML
const parseXML = xmlDoc => {
return new Promise((resolve, reject) => {
xmlParser(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
};
//Обработчик "До" для полученного сообщения
const before = async prms => {
//Если пришел запрос в JSON
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
//Конвертируем полученный в JSON-запрос в XML, понятный серверной части
let request = {};
let requestXML = "";
try {
request = JSON.parse(prms.queue.blMsg.toString());
requestXML = js2xmlparser.parse(SREQUEST_ROOT, request[SREQUEST_ROOT]);
} catch (e) {
requestXML = "";
}
//Возвращаем отконвертированное в качестве тела запроса
return {
blMsg: new Buffer(requestXML)
};
}
};
//Обработчик "После" для полученного сообщения
const after = async prms => {
//Если пришел запрос в JSON
if (prms.options.headers["content-type"] == SHEADER_CONTENT_TYPE_JSON) {
//Конвертируем ответ, подготовленный сервером, в JSON
parseRes = await parseXML(prms.queue.blResp.toString());
//Выставим в заголовке верный тип отправляемых данных
let tmpOptionsResp = _.cloneDeep(prms.optionsResp);
tmpOptionsResp.headers["content-type"] = SHEADER_CONTENT_TYPE_JSON;
//Вернём его клиенту в таком виде
return {
optionsResp: tmpOptionsResp,
blResp: new Buffer(JSON.stringify(parseRes))
};
}
};
//-----------------
// Интерфейс модуля
//-----------------
exports.before = before;
exports.after = after;