Commit 2e29c86d authored by Martin Ou's avatar Martin Ou

初始化

parents
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
\ No newline at end of file
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('pdf-web:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '4000');
app.set('port', port);
// var cluster = require('cluster');
// var numCPUs = require('os').cpus().length;
// var server = http.createServer(app);
// if (cluster.isMaster) {
// // Fork启一个Worker 进程
// for (var i = 0; i < numCPUs; i++) {
// cluster.fork();
// }
// cluster.on('listening', (worker, address) => {
// console.log('worker ' + worker.process.pid + ', listen: ' + address.address + ":" + address.port);
// });
// cluster.on('exit', (worker, code, signal) => {
// console.log('worker ' + worker.process.pid + ' died');
// //重启一个worker进程
// cluster.fork();
// });
// } else {
// // Worker 进程之间可以共享任何形式的TCP连接
// // 也可以启动一个express的web服务
// server.listen(port);
// }
/**
* Create HTTP server.
*/
var server = http.createServer(app)
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string' ?
'Pipe ' + port :
'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string' ?
'pipe ' + addr :
'port ' + addr.port;
debug('Listening on ' + bind);
}
\ No newline at end of file
body {
padding: 50px;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}
a {
color: #00B7FF;
}
var express = require('express');
const app = express();
var router = express.Router();
// router.get("/report-pdf", async (req, res, __) => {
// console.log(req.query);
// let result = await saveToPdf(req.query.url);
// console.log(result, 'result');
// // res.send(result);
// });
module.exports = router;
\ No newline at end of file
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
module.exports = router;
const express = require('express');
const app = express();
const port = 4000;
let browser;
let pageList = [];
let waitList = [];
// 初始化 1个 browser, 5个 page
(async () => {
const puppeteer = require('puppeteer');
browser = await puppeteer.launch({
headless: true,
args: [
'–disable-gpu',
'–disable-dev-shm-usage',
'–disable-setuid-sandbox',
'–no-first-run',
'–no-sandbox',
'–no-zygote',
'–single-process'
],
});
for (let i = 1; i < 6; i++) {
let page = await browser.newPage();
let instance = {
page: page, // page实例
useCount: 0, // 使用次数
status: true, // page 是否可用
order: i // 序号
}
pageList.push(instance)
}
})()
async function createPage(order, flag) {
let page = await browser.newPage();
let instance = {
page: page,
useCount: 0,
status: true,
order: order
}
if (flag) {
pageList.splice(order - 1, 1, instance);
} else {
pageList.push(instance)
}
}
async function getPDF(url, curPage, performId, languageCode) {
// 把该page 设为 不可用,等待开启
pageList[curPage.order - 1] = {
...curPage,
status: false,
useCount: curPage.useCount++
};
console.log(url, 'url----');
await curPage.page.goto(url, {
timeout: 120000,
waitUntil: 'networkidle0'
}).catch(res => {
console.log(res, 'goto catch');
});
let fileName = 'pdf/' + performId + '_' + languageCode + '.pdf';
await curPage.page.pdf({
path: fileName,
printBackground: true,
format: 'Letter',
scale: 1,
margin: {
top: "0px",
left: "0px",
right: "0px",
bottom: "0px"
}
});
return fileName
}
app.get('/report', async (req, res) => {
//var params = req.query;
let {
url = '', print = true, languageCode = 'en_US', performId = '', direction = ''
} = req.query;
url = url + '?print=' + print + '&languageCode=' + languageCode + '&performId=' + performId + '&direction=' + direction
let curPage = getPage();
if (curPage.length !== 0) {
// 先检查 waitList,是否有任务
if (waitList.length !== 0) {
waitList.push(url);
url = waitList[0];
}
let fileName = await getPDF(url, curPage, performId, languageCode).catch(err => {
console.log(err, 'getPDF err');
});
res.json({
message: "生成pdf文件成功",
path: fileName
})
// 该页面结束,检查一遍useCount,若为6,,关闭该page,重新打开一个page
if (curPage.useCount > 5) {
await curPage.page.close();
await createPage(curPage.order, true)
} else {
pageList[curPage.order - 1] = {
...curPage,
status: true
};
}
} else {
waitList.push(url);
}
});
function getPage() {
let curPage = pageList.filter(page => page.status);
console.log(curPage.length, 'curPage');
//目前:根据 可用数组的长度,来随机一个数,简单的做一个负载均衡, todo:进一步提高方法
let tmp = Math.floor(Math.random() * curPage.length);
return curPage.length !== 0 && curPage[tmp] ? curPage[tmp] : []
}
//Initialises the express server on the port 30000
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
\ No newline at end of file
const express = require('express');
const app = express();
const port = 4000;
let browser;
let pageList = []
let waitList = [];
let checkWaitListInterval;
let times = 0;
// 初始化 1个 browser, 6个 page
(async () => {
const puppeteer = require('puppeteer');
browser = await puppeteer.launch({
headless: true,
args: [
'–disable-gpu',
'–disable-dev-shm-usage',
'–disable-setuid-sandbox',
'–no-first-run',
'–no-sandbox',
'–no-zygote',
'–single-process'
],
});
for (let i = 1; i < 7; i++) {
let page = await browser.newPage();
let instance = {
page: page,
useCount: 0,
status: true,
order: i
}
pageList.push(instance)
}
})()
async function createPage(order, flag) {
let page = await browser.newPage();
let instance = {
page: page,
useCount: 0,
status: true,
order: order
}
if (flag) {
pageList.splice(order - 1, 1, instance);
} else {
pageList.push(instance)
}
}
async function getPDF(url, curPage, performId, languageCode) {
if (waitList.length !== 0) {
waitList.splice(0, 1);
}
pageList[curPage.order - 1] = {
...curPage,
status: false,
useCount: curPage.useCount++
};
await curPage.page.goto(url, {
timeout: 120000,
waitUntil: 'networkidle0'
}).catch(res => {
console.log(res, 'goto catch');
});
let fileName = 'pdf/' + performId + '_' + languageCode + '.pdf';
await curPage.page.pdf({
path: fileName,
printBackground: true,
format: 'Letter',
scale: 1,
margin: {
top: "0px",
left: "0px",
right: "0px",
bottom: "0px"
}
});
return fileName
}
// let num = Number(process.argv.slice(2)[0]);
// console.log(process.argv.slice(2)[0], 'process');
app.get('/report', async (req, res) => {
clearInterval(checkWaitListInterval);
checkWaitListInterval = setInterval(getWaitPdf, 1000);
times = 0;
var params = req.query;
var url = params.url + '?print=' + params.print + '&languageCode=' + params.languageCode + '&performId=' + params.performId + '&direction=' + params.direction;
let curPage = getPage();
// 检查是否有可用的page
if (curPage.length !== 0) {
// 先检查 waitList,是否有任务
if (waitList.length !== 0) {
waitList.push(url);
url = waitList[0];
}
let fileName = await getPDF(url, curPage, params.performId, params.languageCode).catch(err => {
console.log(err, 'getPDF err');
});
res.json({
message: "生成pdf文件成功",
path: fileName
// num: num
})
// 该页面结束,检查一遍useCount,若为6,,关闭该page,重新打开一个page
if (curPage.useCount > 5) {
await curPage.page.close();
await createPage(curPage.order, true)
} else {
pageList[curPage.order - 1] = {
...curPage,
status: true
};
}
} else {
waitList.push(url);
}
});
function getPage() {
let curPage = pageList.filter(page => page.status);
//目前:根据 可用数组的长度,来随机一个数,简单的做一个负载均衡, todo:进一步提高方法
let tmp = Math.floor(Math.random() * curPage.length);
return curPage.length !== 0 && curPage[tmp] ? curPage[tmp] : []
}
async function getWaitPdf() {
let curPages = pageList.filter(page => page.status);
if (waitList.length !== 0 && curPages.length >= 6) {
times = 0;
let max = waitList.length > 6 ? 6 : waitList.length;
for (let i = 0; i < max; i++) {
let url = waitList[i];
if (!url) return
let params = GetRequest(url)
await getPDF(url, curPages[i], params.performId, params.languageCode);
waitList.splice(i, 1);
pageList[curPages[i].order - 1] = {
...curPages[i],
status: true
}
if (curPages[i].useCount > 5) {
await curPages[i].page.close();
await createPage(curPages[i].order, true)
}
}
}
if (curPages.length >= 6) {
times++;
if (times > 10) {
// 10秒后,若检测不存在 url,关闭定时器
clearInterval(checkWaitListInterval)
//console.log(waitList, 'waitList times');
}
}
}
function GetRequest(url) {
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
//Initialises the express server on the port 30000
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
\ No newline at end of file
extends layout
block content
h1= message
h2= error.status
pre #{error.stack}
extends layout
block content
h1= title
p Welcome to #{title}
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment