遇到有极少部分电脑在下载文件时,进度条不动了,无报错。监听的end, complate,data,error,都不触发
测试时发现
1、所有文件均有可能出现下载过程中莫名停止,不管文件大小,不管什么文件后缀。
2、使用http下载,没有重现。
怀疑1:是否文件服务器问题导致?
不是。因为换一个https服务器地址,测试时仍会出现。
怀疑2:是否https包有问题?
不是。不用https.get改用request的方式请求,测试时仍会出现。
参考 nodejs模块request的官方文档
怀疑3:是否超时?
是。但为何监听不到?因为默认超时时间好像是2分钟吧。
一方面代码没设置时长,一方面测试时从未等待到2分钟以上,误以为是卡住了。
后续因为验证怀疑2时把https.get改成request了,就在request的基础上加上超时限制。
const req = request({
method: 'GET',
uri: mfileDownUrl,
timeout: 2000
});
req.on('error', function(e) {
console.error('[error]: ' + e);
});
req.on('abort', function() {
console.log('abort...');
});
设置超时时间,会先触发abort,然后触发error收到Error: ESOCKETTIMEDOUT
参考 electron使用nodejs实现文件流式下载并显示进度
参考 http.get 怎么捕获timeout(网络超时)事件?
文件下载未考虑超时的情况导致的。
https.get使用不熟练,知道超时又监听不到,监听到了中止不了。
最后改用request,设置timeout,触发error收到Error: ESOCKETTIMEDOUT事件时是超时。
中止文件下载使用req.abort()
建议下载文件时一定要带上的监听几件套
const req = request({
method: 'GET',
uri: mfileDownUrl,
timeout: 2000//可以设置大点,这里是因为在测试
});
mfile = fs.createWriteStream(mfileFullName);
req.pipe(mfile);
req.on('error', function(e) {
console.error('[error]: ' + e);
});
req.on('abort', function() {
console.log('abort...');
});
req.on('response', (data) => {
// 更新总文件字节大小
})
req.on('data', (chunk) => {
//更新进度条
});
req.on('end', () => {
console.log('下载已完成,等待处理');
});