Node.js process.stdout.on(';data';,…)和process.stderr.on(';data';,…)的顺序

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/

我正在写一个electron应用程序,这个应用程序处理从electron内部执行的终端命令

我在执行
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命令只是我发现它的情况。可能有完全不同的命令。