我们有一个特定的 NodeJS 软件,它可以将文件下载到它的本地文件系统。这些文件可以从几 KB 到 GB。有时,没有明显的原因,下载速度变得非常慢。实际连接相当不错且稳定。奇怪的是,缓慢的下载只会在下载开始时发生,并且不会恢复到不错的速度。
这个问题间歇性地发生,它可能发生在第一次下载或另一个下载完成之后。该代码按顺序下载文件,因此不会同时下载多个文件。发生问题时,只需简单地停止 NodeJS 进程并重新启动即可解决问题。
在输出样本下方:
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[ ] 0%
0.00 of 3.26 GB
------------------------------------
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[================================== ] 34%
1.13 of 3.26 GB
------------------------------------
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[======================================================================= ] 71%
2.33 of 3.26 GB
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[================================================================================================= ] 97%
3.17 of 3.26 GB
------------------------------------
Download of content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip completed.
Downloading next file
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.01 of 3.48 GB
正如您在上面的输出中看到的,第一个(或上一个文件)以正常速度下载。第二个在同一台服务器上几乎根本不下载。
对于下载,库 Request(v2.87.0) 与 Request-progress (v3.0.0) 一起使用来显示下载进度。该问题发生在 Windows 和 Linux 平台上。我们注意到在多个 NodeJS 版本上也有问题,例如 8.11.1 和 8.11.3
用于下载的代码:
function download (url, pathToFile) {
const context = this;
return new Promise((resolve, reject) => {
const options = {
// Set 10 minutes timeout for connect / fetch
timeout: 600000,
headers: {}
};
const req = request.get(url, options);
progress(req, {
throttle: 60000, // Throttle the progress event, defaults to 1000ms
delay: 0 // Only start to emit after a delay of some milliseconds - default is 0ms
})
.on('progress', (state) => {
showProgress(state);
})
.on('error', (error) => {
req.abort();
reject(error);
})
.on('response', (response) => {
response.on('end', resolve);
})
.pipe(fs.createWriteStream(pathToFile, { flags: options.headers.Range ? 'a' : 'w' }));
});
};
function showProgress(state) {
let progressIndicator = '';
let balanceIndicator = '';
let progress = 0;
const percent = parseInt(state.percent * 100);
for (progress = 1; progress <= percent; progress++) {
progressIndicator += '=';
}
for (let balance = progress; balance <= 100; balance++) {
balanceIndicator += ' ';
}
let totalSize = ((state.size.total / 1024) / 1024).toFixed(2);
let receivedSize = ((state.size.transferred / 1024) / 1024).toFixed(2);
let sizeUnit = 'MB';
if (totalSize >= 1024) {
totalSize = (totalSize / 1024).toFixed(2);
receivedSize = (receivedSize / 1024).toFixed(2);
sizeUnit = 'GB';
}
console.log(`[${progressIndicator}${balanceIndicator}]`, `${percent}%`);
console.log(receivedSize, 'of', totalSize, sizeUnit, '\n');
console.log('------------------------------------');
console.log(' ');
}
没有错误,只是下载速度很慢,所以很难调试这个问题是从哪里来的。
欢迎任何建议