当前位置: 首页 > news >正文

electron打包后主进程下载文件崩溃

electron+vue3写了一个小项目,实现了一个文件下载功能

存在的问题

	打包后,应用下载文件崩溃

代码

// 渲染进程window.electron.ipcRenderer.invoke('save-file', {'path': r.filePath,'fileurl': previewUrl,}).then(response => {console.log('response --------------');console.log(response);})// 主进程
ipcMain.handle('save-file', (event, args) => {// process.crash()try {// 下载保存文件console.log('axios args.fileurl ------------');console.log(args.fileurl);return downloadFile(args.fileurl, args.path)} catch (error) {console.log('error ---------------------------')console.log(error)return 'save-file 出错了: \n' + error.toString()}
});// 工具文件
import axios from 'axios'
import fs from 'fs/promises'export function downloadFile(downloadUrl, downloadPath) {try {return axios.get(downloadUrl, {method: 'GET',headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36","Referer": downloadUrl,},responseType: 'arraybuffer'}).then(res => {console.log('下载成功')return fs.writeFile(downloadPath, res.data, "binary").then(r => {console.log('保存成功')return fs.stat(downloadPath)});}).catch(e => {console.log('e ------------------')console.log(e)return e});} catch (error) {console.log('error ---------------------------')console.log(error)return 'downloadFile 出错了: \n' + error.toString()}
}

解决思路

首先,要复现,我测试了自己的笔记本电脑,双系统都没问题,没办法复现这个bug,但是测试那边两台电脑都能复现,测试是在外地!我只好又找了一台闲置电脑,还好复现出来了,否则只能回家试试自己的电脑了

第二,找到问题所在,打包后 console.log 就看不到了,我想办法记录日志,看了官方的crashReporter,还有不少人推荐,我正好全栈,就搞了个接口接收日志,但是没有任何报错。后来试了electron-log,记录在用户本地,真香,简单好用,以后有需要直接搞个接口上传log文件就好了!还是没报错!但是我锁定了有问题的那一行代码,就是 axios.get(downloadUrl, { 这里崩溃的!

第三,想办法换掉axios!试了第三方electron下载库,electron-download、electron-dl、都很难用,文档少,搜索结果更少,自己摸索半天也没跑起来,继续换electron-download-manage,但是这个东西调用很麻烦!换request下载,和axios比较像,还是不行!我觉得我的方向可能错了,灵机一动,把axios下载放在渲染进程里面,下载好的数据传递给主进程!好了!

代码

// 渲染进程axios.get(previewUrl, {method: 'GET',responseType: 'arraybuffer'}).then(res => {console.log('下载成功')console.log('下载成功')console.log('下载成功')console.log(typeof res.data)window.electron.ipcRenderer.invoke('save-file', {'data': res.data,'path': r.filePath,}).then(response => {console.log('response --------------');console.log(response);})// 主进程ipcMain.handle('save-file', (event, args) => {try {log.info('event, args ------------');log.info(event, args);// 保存文件return saveFile(args.data, args.path)} catch (error) {log.info('error ---------------------------')log.info(error)return 'save-file 出错了: \n' + error.toString()}
});// 工具js
import fs from 'fs/promises'
import log from 'electron-log'
import { Buffer } from 'buffer'export function saveFile(data, downloadPath) {log.info('saveFile ----------------------- 0')try {log.info('saveFile ----------------------- 1')return fs.writeFile(downloadPath, Buffer.from(data), "binary").then(r => {log.info('保存成功')return fs.stat(downloadPath)});} catch (error) {log.info('saveFile ----------------------- 3')log.info('error ---------------------------')log.info(error)throw new Error('saveFile出错了:' + error.toString()) // 将错误包装成新的Error对象并抛出,让调用者知道发生了错误}
}

中间还发生了一个小插曲

Error occurred in handler for 'save-file': 
TypeError [ERR_INVALID_ARG_TYPE]: 
The "data" argument must be of type string or an instance of 
Buffer, TypedArray, or DataView. Received an instance of ArrayBuffer

所以才有了Buffer.from(data)
感谢文心一言,感谢我自己!

http://www.lryc.cn/news/188258.html

相关文章:

  • Spring实例化源码解析之Custom Events下集(九)
  • python numpy库关键函数说明
  • 【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)
  • IP协议总结
  • 微信支付v2
  • tcpdump(二)命令行参数讲解(一)
  • 10_8C++
  • JVM篇---第七篇
  • 更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法
  • winform窗体控件太多显示不过来,怎么实现滚动条
  • WebSocket连接异常 Error parsing HTTP request header Connection reset by peer
  • Spring中shutdown hook作用
  • 关于IvorySQL和OpenGauss包SPEC处理的一些思考
  • 我用PYQT5做的第一个实用的上位机项目(六)
  • 【高级语言程序设计】python函数式编程(一)
  • 使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件
  • flutter实现透明appbar(一)
  • (四)正点原子STM32MP135移植——u-boot移植
  • [计算机入门] 应用软件(办公类)
  • 基于安卓android微信小程序音乐播放器
  • Java的指针、引用与C++的指针、引用的对比
  • 串级/级联控制知识点整理
  • 数据产品读书笔记——认识数据产品经理
  • 从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 创建虚拟机
  • GIT版本控制--前言
  • 由于 MAC 地址的问题,导致网络不通的原因和分析
  • 游戏开发中的设计模式
  • React核心原理与实际开发
  • Springboot+vue的企业OA管理系统(有报告),Javaee项目,springboot vue前后端分离项目。
  • 3、字符设备驱动框架和开发步骤