Nightmare.js无法与Azure webjob

时间:2017-05-18 03:03:17

标签: javascript node.js azure azure-webjobs nightmare

我正在尝试运行一个天蓝色的webjob,它接受一个json对象并呈现一个网页,然后通过Nightmare.js中的电子浏览器将其打印为pdf。

当我在本地运行它时效果很好,但是当我在azure webjob中运行它时它永远不会完成 我将两个console.log语句输出到日志中,但看到我无法从nightmare.js调用中输出任何内容,也没有显示电子浏览器窗口,我不知道出了什么问题。

脚本中还有一个Web服务器,省略了,因为它似乎接受了json对象的请求并将其传递给createPage就好了。

我已经验证index.html文件位于正确的目录中。有谁知道什么可能是错的?

var Nightmare = require('nightmare'),
    http = require('http');

function createPage(o, final) {

    var start = new Date().getTime();
    var page = Nightmare({
        //show: true, //uncomment to show electron browser window
        //openDevTools: { mode: 'detach'}, //uncomment to open developer console ('show: true' needs to be set)
        gotoTimeout: 300000, //set timeout for .goto() to 2 minutes
        waitTimeout: 300000, //set timeout for .wait() to 5 minutes
        executionTimeout: 600000 //set timeout for .evaluate() to 10 minutes
    })
    .goto('file:\\\\' + __dirname + '\\index.html');

    page.wait("#ext-quicktips-tip") //wait till HTML is loaded
    .wait(function () { // wait till JS is loaded
        console.log('Extjs loaded.');
        return !!(Ext.isReady && window.App && App.app);
    });

    console.log("CreatePage()1");

    page.evaluate(function (template, form, lists, printOptions) {
        App.pdf.Builder.create({
            template: template,
            form: form,
            lists: lists,
            format: o.printOptions.format,
        });
        console.log('Create done');
    }, template, form, o.lists, printOptions);

    console.log("CreatePage()2");
    page.wait(function () {
        console.log('Content created. ' + App.pdf.Builder.ready);
        return App.pdf.Builder.ready;
    })
    .pdf(o.outputDir + form.filename, { "pageSize": "A4", "marginsType": 1 })
    .end()
    .then(function () {
        console.log('Pdf printed, time: ' + (new Date().getTime() - start) / 1000 + ' seconds');
        final(true);
    })
    .catch(function (err) {
        console.log('Print Error: ' + err.message);
    });
}

解决

正如里克在答案中所述,这目前无效! 本文档列出了webjobs沙箱的当前状态:
https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox
它有关于我的问题的以下段落:

  

从HTML生成PDF

     

有多个库用于将HTML转换为PDF。许多Windows / .NET特定版本利用IE API,因此广泛利用User32 / GDI32。这些API在沙箱中被大量阻止(无论计划如何),因此这些框架在沙箱中不起作用。

     

有些框架没有广泛利用User32 / GDI32(例如wkhtmltopdf),我们正在使用与启用SQL报告相同的方式在Basic中启用这些框架。

1 个答案:

答案 0 :(得分:1)

我认为对于nightmare.js来说,你需要桌面互动,这是你在WebJob上没有得到的。

取自Github上的this issue

  

梦魇不是真正的无头:它需要一个电子实例   工作,这反过来需要帧缓冲区正确渲染(在   至少,现在)。

这不会在Azure WebJob上播出。