重用带有噩梦的电子会话
Reuse electron session with nightmare
我正在使用 Nightmare.js 打印 pdf。
我向节点服务器发送请求并构建页面,使用 Nightmare 确保页面已加载,然后打印 pdf。
但是对于每个请求,我都创建了一个新的电子 window,我如何重复使用相同的 window,或者最大 X 电子的池 windows,来处理我的 pdf 打印?
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);
我知道在上一次打印完成之前可能再次使用相同的电子 window 可能会出现所有并发问题,所以我希望答案能够明确说明如何避免这种情况。
您需要创建一次噩梦实例,而不是在循环中。
var page = nightmare()
.goto('file:\\' + __dirname + '\index.html');
这会在您每次创建页面时创建新的噩梦实例。
您可以创建一次实例
const Nightmare = require('nightmare');
const browser = Nightmare();
然后每次用browser.goto(url)。您可以使用以下给出的答案链接您的 goto 语句:https://github.com/segmentio/nightmare/issues/708
摘自其中一个答案:
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()
}
您还可以创建多个浏览器,也用于池化。
var browser1 = Nightmare();
var browser2 = Nightmare();
我正在使用 Nightmare.js 打印 pdf。 我向节点服务器发送请求并构建页面,使用 Nightmare 确保页面已加载,然后打印 pdf。 但是对于每个请求,我都创建了一个新的电子 window,我如何重复使用相同的 window,或者最大 X 电子的池 windows,来处理我的 pdf 打印?
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);
我知道在上一次打印完成之前可能再次使用相同的电子 window 可能会出现所有并发问题,所以我希望答案能够明确说明如何避免这种情况。
您需要创建一次噩梦实例,而不是在循环中。
var page = nightmare()
.goto('file:\\' + __dirname + '\index.html');
这会在您每次创建页面时创建新的噩梦实例。 您可以创建一次实例
const Nightmare = require('nightmare');
const browser = Nightmare();
然后每次用browser.goto(url)。您可以使用以下给出的答案链接您的 goto 语句:https://github.com/segmentio/nightmare/issues/708
摘自其中一个答案:
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()
}
您还可以创建多个浏览器,也用于池化。
var browser1 = Nightmare();
var browser2 = Nightmare();