Построение отчета на сервере
Добавлено: 29 ноя 2023, 14:51
Всем привет.
Тут не вопрос, а скорее заметка для тех кто столкнется с такой же проблемой.
Дано: Stimulsoft Report.JS, веб-сервис на котором реализован адаптер данных, и с которым успешно взаимодействует вьювер с фронтовой части приложения.
Нужно: Добавить сервис для построения отчетов на сервере(например по расписанию), но без прямого доступа к БД(т.е. с использованием существующего адаптера данных).Все это должно работать на node.js.
При добавлении в проект стимулсофта через под капотом будет вызван метод инициализации для node.js и проставлен в false флаг Stimulsoft.System.NodeJs.useWebKit. Дальше если следовать инструкции по подключению к адаптеру данных, мы должны указать ссылку на сервер с адаптером, что-то типа
И вот тут возникает проблема, т.к. при инициализации стимулсофта для node.js, в недрах кода происходит подмена метода получения данных, и при наличии ссылки на веб-сервер с адаптером мы уходим в рекурсию и получаем ошибку Range Error: Maximum call stack size exceeded, причем ошибка "тихая", просто пишется в консоль и не пробрасывается дальше. Насколько я понял(из исходников), при работе в node.js ожидаемым поведением является работа напрямую с адаптером данных(с прямым подключение к БД), и наличие ссылки на веб-сервер заставляет приложение уходить в рекурсию.
Как обойти:
Я решил эту проблему следующим образом, вместо: инициализирую стимулслфт следующим образом(подсмотрел чать методов в index.js npm пакета):
Пока остановился на этом решении.
Вопрос к поддержке Стимулсофт, подскажите, допустим ли описанный выше вариант или может быть есть более простой способ обойти описанное поведение?
Тут не вопрос, а скорее заметка для тех кто столкнется с такой же проблемой.
Дано: Stimulsoft Report.JS, веб-сервис на котором реализован адаптер данных, и с которым успешно взаимодействует вьювер с фронтовой части приложения.
Нужно: Добавить сервис для построения отчетов на сервере(например по расписанию), но без прямого доступа к БД(т.е. с использованием существующего адаптера данных).Все это должно работать на node.js.
При добавлении в проект стимулсофта через
Код: Выделить всё
var Stimulsoft = require("stimulsoft-reports-js");
Код: Выделить всё
Stimulsoft.StiOptions.WebServer.url = "http://localhost/report";
Как обойти:
Я решил эту проблему следующим образом, вместо:
Код: Выделить всё
var Stimulsoft = require("stimulsoft-reports-js");
Код: Выделить всё
Stimulsoft = require("stimulsoft-reports-js/Scripts/stimulsoft.reports").Stimulsoft;
Stimulsoft.ExternalLibrary.xmldoc = require("xmldoc");
//метод получения данных до инициализации под node.js
const v = Stimulsoft.Report.Dictionary.StiDataAdapterService.prototype.serviceType;
//заменяем функцию на исходную до инициализации, а она уже потом подставится
//при инициализации, и по сути мы пропустим подмену функции
Stimulsoft.System.NodeJs.callRemoteApi = v.callRemoteDataAdaptersApi;
//говорим что мы не в браузере
Stimulsoft.System.NodeJs.useWebKit = false;
//применяем настройки для node.js
Stimulsoft.System.NodeJs.initialize();
//указываем сервер с адаптером данных
Stimulsoft.StiOptions.WebServer.url = "http://localhost/report"
Вопрос к поддержке Стимулсофт, подскажите, допустим ли описанный выше вариант или может быть есть более простой способ обойти описанное поведение?