【问题标题】:Node return byte array after turning html to pdf将html转换为pdf后节点返回字节数组
【发布时间】:2020-04-28 05:56:08
【问题描述】:

我正在使用“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"
        };
    }
};

【问题讨论】:

    标签: javascript node.js azure-functions html-pdf


    【解决方案1】:

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

    下面是我的测试代码:

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

    【讨论】:

    • 这很好,但是你如何让它异步运行呢?我尝试将其部署到天蓝色,但它不起作用。
    【解决方案2】:

    如果将来有人需要解决这个问题,您必须从 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);
            })
        });
    
    }
    

    【讨论】:

    • S1 应用服务计划是否足以满足此要求?
    • 只要它的专用而不是消耗就可以了。
    • 谢谢。不过要记住一件事,这花了我几个小时。如果你使用例如在 Mac 上使用 VS Code,您需要确保从某些 Windows 部署中使用 phantomjs-prebuild - 否则它将无法工作。部署将获取 mac 二进制文件并将其放入 azure 函数窗口,导致 phantom.js 崩溃。
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2017-11-27
    • 2015-09-16
    • 1970-01-01
    • 2014-10-26
    • 2016-06-22
    • 2012-02-24
    相关资源
    最近更新 更多