项目场景:
提示:这里简述项目相关背景:
前提是下载一个很大 几个G甚至几十个G的文件 设想是在nodejs里负责创建文件夹和下载
问题描述
提示:这里描述项目中遇到的问题:
通过 axios模块进行下载,但报了
The provided value 'stream' is not a valid enum value of type XMLHttpRequestResponseType.
c
const response = await axios({
url: file_url,
method: 'GET',
timeout: 0,
responseType: 'stream'
});
原因分析:
提示:这里填写问题的分析:
超时 不管怎样都捕捉不到错误 下载进度也获取不到 只能捕获超时的错误 因为文件过大 还不能设置超时 所以等于完全无反应的,所以就先从请求头入手 调试发现跟请求头无关 试了一堆一堆的方式 掠过 直接说解决方案
解决方案:
本来node.js是通过
typescript
webPreferences: {
allowRunningInsecureContent: true,
webSecurity: false,
preload: path.join(__dirname, "preload.js"),
},
主入口文件里加载preload.js 脚本主要用于在渲染进程和主进程之间建立安全的通信桥梁,它的运行环境比较特殊,更接近浏览器环境,这就可能导致 axios 基于 XMLHttpRequest 来处理请求,从而出现不支持 'stream' 响应类型的错误。
把微服务部署位置放在
typescript
app.whenReady().then(() => {
startHttpServe()
createWindow();
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
就好了
app.whenReady() 是在 Electron 主进程里执行的,主进程本质上就是一个 Node.js 进程,在这个环境下 axios 基于 http 和 https 模块实现,能够很好地支持 'stream' 响应类型,所以把代码放到这里执行就没问题了。