Узел возврата байтового массива после поворота html в pdf - PullRequest
0 голосов
/ 28 апреля 2020

Я использую пакет html -pdf npm для создания байтового массива в функции nodeJs azure. Я могу войти и увидеть, что байтовый массив создается, но когда я вызываю свою функцию, я не могу получить буфер для возврата. Мой ответ - 200, и снова я могу видеть буфер, если я записываю его в строку. Для контекста пакет принимает строку html и возвращает pdf. Как мне установить ответ для возврата байтового массива?

var pdf = require('html-pdf');

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    if ((req.body && req.body.data)) {
        var html = req.body.data;
        context.log(html);
        console.log(html);
        var data = []
         pdf.create(html).toBuffer(function(err, buffer){
            data.push(buffer);
            context.res = {
                setEncoding: 'binary',
                // status: 200, /* Defaults to 200 */
                body: Buffer.concat(data)
            };
          });
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я мог воспроизвести эту проблему, затем я провел некоторое исследование и получил надежный ответ , поэтому я изменил функцию на обычную (не асинхронную c) функцию.

Ниже мой тестовый код:

var pdf = require('html-pdf');
module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    const html=req.body;
    context.log(html);
    var data = []
    pdf.create(html).toBuffer(function(err, buffer){
    data.push(buffer);
    context.res = {
        setEncoding: 'binary',
        // status: 200, /* Defaults to 200 */
        body: Buffer.concat(data)
    };
    context.done();
    });
}

Я использую почтальона для отправки запроса, он возвращает ответ, я выбираю Save to a file, затем я открываю файл. Это завершено.

enter image description here

0 голосов
/ 04 мая 2020

Если кому-то понадобится выяснить это в будущем, вам нужно создать новое обещание из pdf.create. Мой код теперь выглядит следующим образом. Это не работает в функции azure, очевидно, из-за поддержки GDI для фантома js

UPDATE , теперь это работает, если развернуто в плане обслуживания приложения. Не будет работать в плане потребления в azure.

var pdf = require('html-pdf');


module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    const html=req.body.data;
    var data = await returnHtmlAsPdf(html);
    var data2 = []
    data2.push(data);
    context.res = {
        setEncoding: 'binary',
        // status: 200, /* Defaults to 200 */
        body: Buffer.concat(data2)
    };
    context.done();
};

async function returnHtmlAsPdf(html) {
    return new Promise((resolve, reject) => {
        pdf.create(html).toBuffer(function(err, buffer){
            if(err){
                reject(err);
            }
            resolve(buffer);
        })
    });

}
...