nodejs spawn执行wget时动态进度条显示不正确

dynamic progress bar is not display correctly when execute wget by nodejs spawn

我写了一个 node.js 代码,就像下面的示例一样。

我使用 child_process.spawn 为执行命令 'wget' 创建子进程。同时我将子进程的标准i/o重定向到node.js进程

的标准i/o
let cp = spawn('wget', 'some_file_url')
cp.stdin.pipe(process.stdin)
cp.stdout.pipe(process.stdout)
cp.stderr.pipe(process.stderr)

现在我在node.js中执行上面的代码,一切正常,但有进度条。它看起来像这样:

     0K .......... .......... .......... .......... ..........  0%  134K 5m21s
    50K .......... .......... .......... .......... ..........  0%  631K 3m14s
   100K .......... .......... .......... .......... ..........  0% 4.64M 2m12s
   150K .......... .......... .......... .......... ..........  0%  167M 99s

通常,如果我在终端上执行 wget 命令

$ wget some_file_url

输出中将显示一个动态进度条

file.tar.gz                  15%[======>                                         ]   6.69M  2.27MB/s

那么,我应该怎么做才能让进度条显示如上

环境

对不起

我的英语很差。请原谅语法或打字错误。我正在努力改进。

我怀疑你得到的效果是由于 GNU Wget 认为它的 stderr 被重定向到文件。我不知道如何使用 GNU Wget 获得所需的效果,但如果您只需要下载文件(并且不需要使用 GNU Wget 这样做),那么请考虑将 httpsprogress 结合使用。最后需要先安装,do

npm install progress

那么你可以像这样使用它(改编自 progress - download example

var fs = require('fs');
var ProgressBar = require('progress');
var https = require('https');
 
var req = https.request({
  host: 'www.example.com',
  port: 443,
  path: '/'
}, function (res) {
  var filePath = fs.createWriteStream('index.html');
  res.pipe(filePath);
});
 
req.on('response', function(res){
  var len = parseInt(res.headers['content-length'], 10);
 
  console.log();
  var bar = new ProgressBar('  downloading [:bar] :rate/bps :percent :etas', {
    complete: '=',
    incomplete: ' ',
    width: 20,
    total: len
  });
 
  res.on('data', function (chunk) {
    bar.tick(chunk.length);
  });
 
  res.on('end', function () {
    console.log('\n');
  });
});
 
req.end();

代码下载 www.example.com 页面并将其保存为 index.html,请注意,与 url for wget 不同,您不包含协议(在本例中为 https)主持人。 443 是 https 的默认端口。 / 是服务器上资源的路径(在本例中为:主页)。 Content-Length header 保存有关总文件大小的信息。