Node.生成显示标准输出实时不起作用



我有一个应用程序,它接收文件链接并下载它们,用于下载我使用的是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事件,从而允许您捕获进度数据。

最新更新