Построение отчета на сервере

Обсуждение Stimulsoft Reports.JS
Ответить
en6o9y
Сообщения: 1
Зарегистрирован: 29 ноя 2023, 14:23

Построение отчета на сервере

Сообщение en6o9y »

Всем привет.

Тут не вопрос, а скорее заметка для тех кто столкнется с такой же проблемой.

Дано: Stimulsoft Report.JS, веб-сервис на котором реализован адаптер данных, и с которым успешно взаимодействует вьювер с фронтовой части приложения.
Нужно: Добавить сервис для построения отчетов на сервере(например по расписанию), но без прямого доступа к БД(т.е. с использованием существующего адаптера данных).Все это должно работать на node.js.

При добавлении в проект стимулсофта через

Код: Выделить всё

var Stimulsoft = require("stimulsoft-reports-js");
под капотом будет вызван метод инициализации для node.js и проставлен в false флаг Stimulsoft.System.NodeJs.useWebKit. Дальше если следовать инструкции по подключению к адаптеру данных, мы должны указать ссылку на сервер с адаптером, что-то типа

Код: Выделить всё

Stimulsoft.StiOptions.WebServer.url = "http://localhost/report";
И вот тут возникает проблема, т.к. при инициализации стимулсофта для node.js, в недрах кода происходит подмена метода получения данных, и при наличии ссылки на веб-сервер с адаптером мы уходим в рекурсию и получаем ошибку Range Error: Maximum call stack size exceeded, причем ошибка "тихая", просто пишется в консоль и не пробрасывается дальше. Насколько я понял(из исходников), при работе в node.js ожидаемым поведением является работа напрямую с адаптером данных(с прямым подключение к БД), и наличие ссылки на веб-сервер заставляет приложение уходить в рекурсию.

Как обойти:
Я решил эту проблему следующим образом, вместо:

Код: Выделить всё

var Stimulsoft = require("stimulsoft-reports-js");
инициализирую стимулслфт следующим образом(подсмотрел чать методов в index.js npm пакета):

Код: Выделить всё

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"
Пока остановился на этом решении.

Вопрос к поддержке Стимулсофт, подскажите, допустим ли описанный выше вариант или может быть есть более простой способ обойти описанное поведение?
Aleksey
Сообщения: 2793
Зарегистрирован: 22 апр 2010, 06:57

Re: Построение отчета на сервере

Сообщение Aleksey »

Здравствуйте,

Необходимо дополнительное время для анализа, о результатах дадим знать.

Спасибо.
#13199
Aleksey
Сообщения: 2793
Зарегистрирован: 22 апр 2010, 06:57

Re: Построение отчета на сервере

Сообщение Aleksey »

Здравствуйте,

Спасибо за ошибку, поправили.

Ваш код фактически возвращает стандартное поведение callRemoteDataAdaptersApi, запросы к адаптерам через http.
Добавили исправление. После фикса, в NodeJs заработает WebServer.url
Stimulsoft.StiOptions.WebServer.url = "http://localhost/report";

Спасибо.
Ответить