Toggle navigation
我的博客
首页
文章列表
留言板
登录
注册
首页
技术分享
文章
node导出服务
作者:
gaohan
•
2021年07月01日
阅读 (1373)
**一.流程**
puppeteer导出PDF,上传阿里云,返回阿里云地址
[puppeteer][1]
[node][2]
[art-template][3]
**二.业务逻辑**
1. puppeteer导出pdf到本地
2. 上传本地pdf到阿里云
3. 删除本地pdf
4. 接口返回阿里云地址
5. html页面使用art-template引擎渲染
**三.具体实现**
1. 构建浏览器实例
```javascript
!(async ()=>{
browser = await puppeteer.launch({
args:['--no-sandbox', "--disable-setuid-sandbox"],
headless: true
});
})()
```
2. 构建具体页面
```javascript
let page = await browser.newPage();
const pagePath = 'http://webtest.iclass30.com:9810/html/export.html'
const url =`${pagePath}workId=${params.workId}&schoolId=${params.schoolId}&title=${params.title}&isAns=${isAns}&hwTypeCode=${hwTypeCode}`
const isConnent = !disconnected && !page.isClosed()
if( isConnent ){
page.setDefaultNavigationTimeout(10000)
}
await page.goto(url, {waitUntil: ['networkidle0', 'load'], timeout: 5000});
```
3. 导出pdf
```javascript
await page.pdf({
path: exportPath,
format: 'A4',
displayHeaderFooter: true,
printBackground: true,
headerTemplate: HeaderRight.format(replaceNames),
footerTemplate: FooterRight.format({textLeft: ''}),//打印偶数页(textLeft)
margin: margin
});
```
4. 上传阿里云并删除本地文件
```javascript
/**
* @name: 上传本地文件
* @param filePath 本地文件路径
* @param uploadPath 上传地址
*/
const uploadFile = (filePath, uploadPath)=>{
fs.readFile(filePath, (err, data)=>{
if( !err ){
upload.getSTSToken('resource').then(()=>{
upload.filePut(uploadPath,data).then(()=>{
deleteFile(filePath)
}).catch(()=>{})
}).catch(()=>{})
}
})
}
/**
* @name: 删除本地文件
* @param filePath 文件详细路径
*/
const deleteFile = (filePath)=>{
fs.unlink(filePath, (err) => {
if(err) {
return
}
console.log('删除成功');
});
}
```
5. 接口返回阿里云地址
```javascript
return new success({msg: '导出成功', data: `https://fs.iclass30.com/${uploadPath}`}
```
**四.node多进程**
```javascript
if (cluster.isMaster) {
console.log('内核数为:', cpuNums);
// 进程分发
for (let i = 0;i < cpuNums; i++) {
cluster.fork()
}
// 消息监听
// Object.keys(cluster.workers).forEach((id) => {
// cluster.workers[id].on('message', (data) => {
// console.log(data)
// })
// });
// 进程守护
cluster.on('disconnect', (worker) => {
console.log('退出工作进程:', worker.process.pid )
cluster.fork();
});
} else {
let server = http.createServer(app);
server.listen(port);
server.on('error', (error)=>{
if (error.syscall !== 'listen') {
throw error;
}
let bind = typeof port === 'string' ? 'pipe ' + port : 'port ' + port;
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;
}
});
server.on('listening', ()=>{
let addr = server.address();
let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
let pid = 'pid ' + process.pid
console.log('子进程运行中:' + bind + ' ' + pid);
});
server.on('connection', ()=>{
let pid = process.pid;
if (!pidObj[pid]) {
pidObj[pid] = 0;
}
pidObj[pid] ++;
let connecmsg = '进程连接:' + 'pid:' + process.pid + ' 连接次数为: ' + pidObj[pid]
console.log(connecmsg);
});
}
```
**五.注意事项**
window部署直接下载依赖运行项目即可
linix部署需注意一下几点:
1. .local-chromium文件夹问题
更改源码puppeteer/lib/cjs/node/BrowersFetch.js 后到puppeteer目录执行
```javascript
node install.js
```
重新下载chromium文件
```javascript
// 修改前:
const browserConfig = {
chrome: {
host: 'https://storage.googleapis.com',
destination: '.local-chromium',
},
firefox: {
host: 'https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central',
destination: '.local-firefox',
},
};
// 修改后:
const browserConfig = {
chrome: {
host: 'https://storage.googleapis.com',
destination: 'local-chromium',
},
firefox: {
host: 'https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central',
destination: 'local-firefox',
},
};
```
2. 需要安装依赖库
```bash
#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y
```
2. 需要字体(乱码问题)
```bash
#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y
```
3. 中文乱码问题(方块问题)
查看中文字体: `fc-list :lang=zh`
linix字体文件夹导入本地的中文字体即可
[1]: http://www.puppeteerjs.com/
[2]: http://nodejs.cn/api/
[3]: http://aui.github.io/art-template/zh-cn/index.html
© 著作权归作者所有
分类
技术分享
标签
node
javascript