2017-05-18 3 views
0

Ich versuche, einen azure Webjob, der ein Json-Objekt und rendert eine Webseite, dann druckt es in pdf, über den Elektronen-Browser in Nightmare.js.Nightmare.js funktioniert nicht mit Azure webjob

Wenn ich dies lokal ausführen funktioniert es perfekt, aber wenn ich es in azure Webjob ausführen, wird es nie abgeschlossen.
Ich bekomme die zwei console.log Anweisungen ausgegeben, um das Protokoll, aber da ich nichts von den Albtraum.js Anrufe ausgeben kann, noch zeigen Sie die Elektronen-Browser-Fenster, ich habe keine Ahnung, was schief geht.

Es gibt auch einen Webserver im Skript, ausgelassen, da es scheint, die Anfrage mit dem JSON-Objekt zu übernehmen und es an createPage zu übergeben.

Ich habe überprüft, dass index.html-Datei im richtigen Verzeichnis ist. Weiß jemand, was falsch sein könnte?

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

Gelöst

Als Rick in seiner Antwort erklärt, wird diese Arbeit nicht zur Zeit! Dieses Dokument listet den aktuellen Stand der webjobs Sandbox:
https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox
Es hat die folgenden Absatz zu meiner Frage im Zusammenhang:

PDF-Generierung von HTML

Es gibt mehrere Bibliotheken verwendet HTML konvertieren zu PDF. Viele Windows/.NET-spezifische Versionen nutzen IE-APIs und nutzen daher User32/GDI32 in hohem Maße. Diese APIs werden (unabhängig vom Plan) weitgehend in der Sandbox blockiert und daher funktionieren diese Frameworks nicht in der Sandbox.

Es gibt einige Frameworks, die User32/GDI32 nicht umfassend nutzen (zum Beispiel wkhtmltopdf) und wir arbeiten daran, diese in Basic + auf die gleiche Weise zu aktivieren, wie wir das SQL-Reporting aktiviert haben.

+0

Welche Art von [WebJobs] (https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-create-web-jobs) verwenden Sie? auf Anfrage, kontinuierlich oder nach Zeitplan? –

+0

Ich benutze kontinuierlich, da ich auch einen HTTP-Webserver im Skript laufen lasse. – Jeppe

+0

Wo wird die Funktion 'createPage' aufgerufen? –

Antwort

0

Ich denke, für die Arbeit von nightmare.js brauchen Sie Desktop-Interaktion, die Sie nicht auf einem WebJob bekommen.

von this issue auf Github Genommen:

Albtraum ist nicht wirklich ohne Kopf: es erfordert eine Elektronen Instanz Arbeit, die wiederum einen Framebuffer richtig (bei dest vorerst) zu machen erfordert.

Dies wird auf einem Azure WebJob nicht ausgeführt.

+0

Vielen Dank, ich habe nach den richtigen Schlüsselwörtern gesucht – Jeppe