Node.js Spawn Display STDOUT live 不工作
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 输出打印到标准输出,它只会在下载完成时显示。
我想知道如何解决这个问题。
我不太了解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 }` );
}
});
(其余代码保持不变)
您不能(轻松地)捕获默认输出的原因是因为进度行仅以回车符结束 return,而不是换行符,这会导致这些行被缓冲,您将最后得到一个 data
事件,其中包含 所有 这些行。
通过更改日志级别,进度行与其他行交织在一起,这将使缓冲区更快填满,或者导致更多 I/O 刷新,从而更频繁地触发 data
事件,让您捕捉进度数据。
我有一个应用程序,它接收文件链接并下载它们,下载我使用 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 输出打印到标准输出,它只会在下载完成时显示。
我想知道如何解决这个问题。
我不太了解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 }` );
}
});
(其余代码保持不变)
您不能(轻松地)捕获默认输出的原因是因为进度行仅以回车符结束 return,而不是换行符,这会导致这些行被缓冲,您将最后得到一个 data
事件,其中包含 所有 这些行。
通过更改日志级别,进度行与其他行交织在一起,这将使缓冲区更快填满,或者导致更多 I/O 刷新,从而更频繁地触发 data
事件,让您捕捉进度数据。