节点 return 转 html 为 pdf 后的字节数组

Node return byte array after turning html to pdf

我正在使用 'html-pdf' npm 包在 nodeJs azure 函数中创建一个字节数组。我可以登录并看到正在创建字节数组,但是当我调用我的函数时,我无法将缓冲区获取到 return。我的回复是 200,如果我将其记录到字符串,我可以再次看到缓冲区。对于上下文,包采用 html 字符串和 returns pdf。如何设置对 return 字节数组的响应?

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"
        };
    }
};

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

下面是我的测试代码:

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();
    });
}

我用邮递员发送请求,它returns一个响应我选择Save to a file,然后我打开文件就完成了。

如果以后有人需要解决这个问题,您必须从 pdf.create 创建一个新的承诺。我的代码现在看起来像这样。由于 GDI 支持 phantom js

,这显然在 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);
        })
    });

}