2017-05-10 3 views
0

J'utilise Nightmare.js pour imprimer des pdf. J'envoie une requête au serveur de noeud et construit la page, en utilisant Nightmare pour m'assurer que la page est chargée, puis j'imprime un pdf. Mais pour chaque demande, je crée une nouvelle fenêtre d'électrons, comment réutiliser la même fenêtre, ou un groupe de fenêtres d'électrons max X, pour gérer mon impression pdf?Réutiliser une session électronique avec un cauchemar

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

Je suis au courant de toutes les questions de concurrence qui pourraient survenir en utilisant éventuellement la même fenêtre électronique à nouveau avant une impression précédente est terminée, donc je voudrais que la réponse à préciser comment cela est évité.

Répondre

0

Vous devez créer l'instance cauchemar une fois et pas en boucle.

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

Ceci crée une nouvelle instance de cauchemar chaque fois que vous créez une page. Vous pouvez créer une instance une fois

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

Ensuite, utilisez chaque fois avec browser.goto (url). Vous pouvez enchaîner votre goto statment à l'aide des réponses données à: https://github.com/segmentio/nightmare/issues/708

Extrait d'une des réponses:

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

Vous pouvez également créer plusieurs navigateurs, pour la mise en commun aussi bien.

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