Nightmare.js не работает с веб-заданием Azure

Я пытаюсь запустить лазурное веб-задание, которое берет объект json и отображает веб-страницу, а затем распечатывает ее в формате PDF через электронный браузер в Nightmare.js.

Когда я запускаю его локально, он работает отлично, но когда я запускаю его в лазурном веб-задании, он никогда не завершается.
Я получаю два вывода console.log в журнал, но, поскольку я не могу ничего выводить из вызовов nightmare.js, ни отображать окно электронного браузера, я понятия не имею, что происходит не так.

В скрипте также есть веб-сервер, который не указан, поскольку он, кажется, принимает запрос с объектом 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);
    });
}

Решено

Как заявляет Рик в своем ответе, в настоящее время это не сработает! В этом документе перечислено текущее состояние песочницы веб-заданий:
https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox
В нем есть следующий абзац, касающийся моей проблемы:

Создание PDF из HTML

Для преобразования HTML в PDF используется несколько библиотек. Многие версии для Windows / .NET используют IE API и поэтому широко используют User32 / GDI32. Эти API-интерфейсы в значительной степени заблокированы в песочнице (независимо от плана), и поэтому эти платформы не работают в песочнице.

Есть некоторые фреймворки, которые не используют широко User32 / GDI32 (например, wkhtmltopdf), и мы работаем над их включением в Basic + так же, как мы включили SQL Reporting.


person Jeppe    schedule 18.05.2017    source источник
comment
Какой тип веб-заданий ты пользуешься? по запросу, постоянно или по расписанию?   -  person Aaron Chen    schedule 18.05.2017
comment
Я использую постоянно, так как в сценарии я тоже использую веб-сервер http.   -  person Jeppe    schedule 18.05.2017
comment
Где вызывается функция createPage?   -  person Aaron Chen    schedule 18.05.2017
comment
Вызывается с http-сервера. Когда он получает запрос POST, он вызывает createPage с объектом json o и обратным вызовом final   -  person Jeppe    schedule 18.05.2017


Ответы (1)


Я полагаю, что для работы nightmare.js необходимо взаимодействие с рабочим столом, чего вы не получите в WebJob.

Взято из этого выпуска на Github:

Nightmare не совсем безголовый: для работы требуется экземпляр Electron, который, в свою очередь, требует правильного рендеринга фреймбуфера (по крайней мере, на данный момент).

Это не сработает для веб-задания Azure.

person rickvdbosch    schedule 18.05.2017
comment
Большое спасибо, заставило меня искать правильные ключевые слова - person Jeppe; 18.05.2017
comment
Привет, у меня есть API, который использует Nightmare для удаления веб-страниц, и тесты не работают во время Azure CI ... вы нашли способ заставить эту работу работать? - person adriancho5692; 18.10.2018