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(...); на вызов функции без необходимости передавать обратный вызов (по крайней мере, не таким же образом).

Другие вопросы по тегам