2017-05-10 3 views
0

Ich benutze Nightmare.js, um pdfs zu drucken. Ich sende eine Anfrage an den Node-Server und baue die Seite, benutze Nightmare, um sicherzustellen, dass die Seite geladen wurde, dann drucke eine PDF. Aber für jede Anfrage erstelle ich ein neues Elektronenfenster, wie benutze ich das gleiche Fenster oder einen Pool von Max X-Elektronenfenstern, um meinen PDF-Druck zu verarbeiten?Wiederverwendungselektronensitzung mit Albtraum

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

function createPage(o, final) { 

    var page = nightmare() 
    .goto('file:\\\\' + __dirname + '\\index.html'); 
    .wait(function() { 
     return !!(window.App && App.app); //Check Javascript has loaded 
    }) 

    page.evaluate(function (template, form, lists, printOptions) { 
     App.pdf.Builder.create({ 
      //args for building pages 
     }); 
    }, o.template, o.form, o.lists, o.printOptions); 

    page.wait(function() { 
     return App.pdf.Builder.ready; 
    }) 
    .pdf(form.filename, { "pageSize": "A4", "marginsType": 1 }) 
    .end() 
    .then(function() { 
     console.log('Pdf printed'); 
     final(true); 
    }) 
    .catch(function (err) { 
     console.log('Print Error: ' + err.message); 
    }); 
} 

http.createServer(function (request, response) { 
    var body = []; 
    request.on('data', function (chunk) { 
     body.push(chunk); 
    }).on('end', function() { 
     body = Buffer.concat(body).toString(); 
     var json = JSON.parse(body); 
     createPage(json, function (status) { 
      if (status === true) { 
       response.writeHead(200, { 'Content-Length': 0 }); 
      } else { 
       response.writeHead(500, { 'Content-Type': 'text/html' }); 
       response.write(' ' + status); 
       console.log('status error: ' + status); 
      } 
      response.end('End of Request \n'); //return status msg, if any 
     }); 
    }); 
}).listen(8007); 

Ich kenne alle Concurrency Probleme, die durch möglicherweise mit dem gleichen Elektronenfenster wieder vor einem vorherigen Druck beendet ist, so möchte ich die Antwort deutlich zu machen, wie das vermieden entstehen könnten.

Antwort

0

Sie müssen die Albtraum-Instanz einmal und nicht in einer Schleife erstellen.

var page = nightmare() 
    .goto('file:\\\\' + __dirname + '\\index.html'); 

Dies schafft neues Alptraum Beispiel jedes Mal, wenn Sie eine Seite erstellen. Sie können Instanz erstellen, sobald

const Nightmare = require('nightmare'); 
const browser = Nightmare(); 

Dann ist es jedes Mal mit browser.goto (url) verwenden. Sie können ketten Ihre goto statment Antworten mit an gegeben: https://github.com/segmentio/nightmare/issues/708

Auszug aus einer der Antworten:

function run() { 
    var nightmare = Nightmare(); 
    yield nightmare 
    .goto('https://www.example.com/signin') 
    .type('#login', 'username') 
    .type('#password', 'password') 
    .click('#btn') 

    for (var i = 0; i < 4; i++) { 
    yield nightmare 
     .goto('https://www.example.com/page'+i) 
     .wait(1000) 
     .evaluate(function(){ 
     return $('#result > h3').text() 
     }) 
    } 

    yield nightmare.end() 
} 

Sie können auch mehrere Browser erstellen, für die auch die Bündelung.

var browser1 = Nightmare(); 
var browser2 = Nightmare(); 
Verwandte Themen