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
那么,我应该怎么做才能让进度条显示如上
环境
- node.js:v14.16.1
- wget:GNU Wget 1.21.2 基于 darwin21.1.0
对不起
我的英语很差。请原谅语法或打字错误。我正在努力改进。
我怀疑你得到的效果是由于 GNU Wget 认为它的 stderr
被重定向到文件。我不知道如何使用 GNU Wget 获得所需的效果,但如果您只需要下载文件(并且不需要使用 GNU Wget 这样做),那么请考虑将 https
与 progress
结合使用。最后需要先安装,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 保存有关总文件大小的信息。
我写了一个 node.js 代码,就像下面的示例一样。
我使用 child_process.spawn 为执行命令 'wget' 创建子进程。同时我将子进程的标准i/o重定向到node.js进程
的标准i/olet 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
那么,我应该怎么做才能让进度条显示如上
环境
- node.js:v14.16.1
- wget:GNU Wget 1.21.2 基于 darwin21.1.0
对不起
我的英语很差。请原谅语法或打字错误。我正在努力改进。
我怀疑你得到的效果是由于 GNU Wget 认为它的 stderr
被重定向到文件。我不知道如何使用 GNU Wget 获得所需的效果,但如果您只需要下载文件(并且不需要使用 GNU Wget 这样做),那么请考虑将 https
与 progress
结合使用。最后需要先安装,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 保存有关总文件大小的信息。