jsReport Как получить данные динамически, используя AJAX GET Request?
Я хочу использовать jsreport для динамической генерации некоторых отчетов на моем веб-сайте (основное приложение asp.net), и у меня есть метод в контроллере, который возвращает JSON, и я хочу получать оттуда данные, используя jsReport для заполнения отчета.
Я опубликую некоторые тестовые значения.контроллер
public JsonResult testReport()
{
FileStream fs = new FileStream("path\\json.txt", FileMode.Open);
using (StreamReader r = new StreamReader(fs))
{
var model = r.ReadToEnd();
test json = JsonConvert.DeserializeObject<test>(model);
return Json(json);
}
}
[HttpGet]
public async Task<IActionResult> MyAction([FromServices] INodeServices nodeServices)
{
var result = await nodeServices.InvokeAsync<byte[]>
("./pdf");
HttpContext.Response.ContentType = "application/pdf";
string filename = @"report.pdf";
HttpContext.Response.Headers.Add("x-filename", filename);
HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "x-filename");
HttpContext.Response.Body.Write(result, 0, result.Length);
return new ContentResult();
}
и фактические сценарии, которые запускаются на странице:
module.exports = function (callback) {
var jsreport = require('jsreport-core')();
jsreport.init().then(function () {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: /* i don`t know how to get data from (/Home/testReport) */
}).then(function (resp) {
callback(/* error */ null, resp.content.toJSON().data);
});
}).catch(function (e) {
callback(/* error */ e, null);
});
};
Я проверил с жестко закодированными и значениями, и это работает, у меня есть проблемы, когда речь идет о динамическом получении данных.
2 ответа
Мне удалось паять это. Проблема заключалась в том, что я пытался запустить клиентский скрипт на сервере, что на самом деле не имело смысла. Поэтому я исправил это, сделав запрос get в скрипте, который я запускаю на сервере. Конечный результат:
module.exports = function (callback) {
var request = require("request");
var getResponse = null;
request.get({
url: '/Home/testReport',
json: true,
}, function (error, response, body) {
if (!error && response.statusCode == 200)
getResponse = body;
});
var jsreport = require('jsreport-core')();
jsreport.init().then(function () {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: getResponse
}).then(function (resp) {
callback(/* error */ null, resp.content.toJSON().data);
});
}).catch(function (e) {
callback(/* error */ e, null);
});
};
Получение данных - это еще одна асинхронная задача, поэтому включите ее в цепочку обещаний таким образом, чтобы она доставляла данные туда, где они необходимы.
Давайте предположим, что вы используете fetch()
чтобы получить данные...
module.exports = function () {
var jsreport = require('jsreport-core')();
return jsreport.init()
.then(function() {
return fetch({/* params */})
})
.then(function(fetchedData) {
return jsreport.render({
template: {
content: 'template bla bla bla',
engine: 'jsrender',
recipe: 'phantom-pdf'
},
data: fetchedData
});
});
};
Примечание: все упоминания о callback
был удален. Возвращая обещание из функции, вызывающий может .then(...).catch(...);
на вызов функции без необходимости передавать обратный вызов (по крайней мере, не таким же образом).