繁体   English   中英

Node.js Spawn Display STDOUT实时无法正常工作

[英]Node.js Spawn Display STDOUT live not working

我有一个应用程序,它接收文件链接并下载它们,对于下载,我使用了aria2c。

为此,我首先使用了exec ,但是由于我想获得下载进度,因此我使用了spawn

这是我正在使用aria2c下载文件的代码:

'use strict';

const
    spawn = require( 'child_process' ).spawn,
    aria2c = spawn( 'aria2c', ['-x8', 'https://wa-us-ping.vultr.com/vultr.com.100MB.bin' ] );

aria2c.stdout.on( 'data', data => {
    console.log( `stdout: ${data}` );
});

aria2c.stderr.on( 'data', data => {
    console.log( `stderr: ${data}` );
});

aria2c.on( 'close', code => {
    console.log( `child process exited with code ${code}` );
});

当我运行此代码时,它不会将aria2c输出打印到stdout,仅在下载完成时显示。

我想知道如何解决此问题。

我不太了解aria2c ,但这是我想到的:

// enable a specific log level
aria2c = spawn( 'aria2c', ['--log-level=info', '-l-', '-x8', 'https://wa-us-ping.vultr.com/vultr.com.100MB.bin' ]);

// find the percentage (this is not well-tested...)
aria2c.stdout.on( 'data', data => {
  data = data.toString();
  if (/ETA:/.test(data)) {
    let pct = data.match(/\(.*?%\)/)[0];
    console.log( `stdout: ${ pct }` );
  }
});

(其余代码保持不变)

您无法(轻松)捕获默认输出的原因是,进度行仅以回车而不是换行符结尾,这导致这些行被缓冲,最后您将遇到一个data事件包含所有这些行。

通过更改日志级别,进度行将与其他行穿插在一起,这将使缓冲区更快地填充,或者导致更多的I / O刷新,因此data事件被触发得更多,从而使您可以捕获进度数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM