4

我们有一个特定的 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(' ');
}

没有错误,只是下载速度很慢,所以很难调试这个问题是从哪里来的。

欢迎任何建议

4

0 回答 0