0

我正在使用“html-pdf”npm 包在 nodeJs 天蓝色函数中创建一个字节数组。我可以记录并看到正在创建字节数组,但是当我调用我的函数时,我无法让缓冲区返回。我的响应是 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"
        };
    }
};
4

2 回答 2

1

我可以重现这个问题,然后我做了一些研究并得到了可靠的答案,所以我将函数更改为普通函数(非异步)函数。

下面是我的测试代码:

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,然后我打开文件 完成。

在此处输入图像描述

于 2020-05-01T08:52:50.993 回答
0

如果将来有人需要解决这个问题,您必须从 pdf.create 创建一个新的承诺。我的代码现在看起来像这样。由于 GDI 对 phantom js 的支持,这显然在 azure 函数中不起作用

如果部署到应用服务计划,更新 现在可以工作。在 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);
        })
    });

}
于 2020-05-04T15:47:28.540 回答