Node.js process.stdout.on(';data';,…)和process.stderr.on(';data';,…)的顺序
我正在写一个electron应用程序,这个应用程序处理从electron内部执行的终端命令 我在执行Node.js process.stdout.on(';data';,…)和process.stderr.on(';data';,…)的顺序,node.js,electron,Node.js,Electron,我正在写一个electron应用程序,这个应用程序处理从electron内部执行的终端命令 我在执行npmls命令时遇到问题。当从cli运行它时,依赖关系树被打印到stdout,右端可能会出现来自stderr的一些警告 请参见下面的屏幕截图 我稍微挖掘了一下npm的源代码,它先注销结果,然后打印错误。就像我在终端看到的一样 但是,当我对child\u进程spawn(或exec)执行相同操作时,顺序是不同的 看起来是因为有大量的代码< StdOut数据, STDRR 打印在所有的 STDUD/
npmls
命令时遇到问题。当从cli运行它时,依赖关系树被打印到stdout,右端可能会出现来自stderr的一些警告
请参见下面的屏幕截图
我稍微挖掘了一下npm的源代码,它先注销结果,然后打印错误。就像我在终端看到的一样
但是,当我对child\u进程
spawn
(或exec
)执行相同操作时,顺序是不同的
看起来是因为有大量的代码< StdOut数据,<代码> STDRR 打印在所有的<代码> STDUD/<代码>的中间。
我写的代码如下:// this is mapped to require( 'child_process' ).spawn
this.$set( 'process', this.spawn(
'npm',
[ 'ls' ],
{
cwd : options.cwd,
// following are only my tryouts - nothing helped :(
// some npm ls command destroy kill the scripts
// with too big buffers in stdout
// maxBuffer : 1024 * 5000
// shell : true
}
) );
// this.handleData is only printing out for nwo
this.process.stdout.on( 'data', this.handleData );
this.process.stderr.on( 'data', this.handleData );
当大数据来自<代码> StdOut时,它与StUDR/<代码>的小数据相吻合,即“代码> STDRR < /代码>在中间被调用。
这是预期的行为吗?我是否可以以某种方式解决此问题,以检索与终端中相同的行为
谢谢。:)
process.stdout
和process.stderr
不保证以任何特定的顺序发送彼此相关的数据,因此,正如您所注意到的,只要任一管道中有任何数量的数据,就可能调用回调
如果您想确保只有在所有stdout
都完成后才处理stderr
,那么您可能需要收听stdout.on('end',cb)
,并且只在该回调中调用stderr.on('data',this.handleData)
<如果你只想得到<代码> NPM LS 的结果,也许你可以考虑尝试一下?文档并不令人惊讶,但它是一个更高级别的API。我也考虑过这一点。用例是更新任何
stdout
或stderr
。当我等待所有的<代码> StdOut,直到我赶上<代码> STDRR 。这可能导致与其他命令不同的问题,在中间需要一个代码> STDRR 。(npm命令只是我发现它的情况。可能有完全不同的命令。