process.stdout.on('data',...)和process.stderr.on('data',...)的顺序

时间:2016-07-28 17:40:01

标签: node.js electron

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

我遇到了执行npm ls命令的麻烦。从cli运行时,依赖关系树将打印到stdout,最后一端会出现来自stderr的警告。

见下面的截图。

correct output

我稍微挖掘了npm源代码,然后先将结果记录下来,然后再打印错误。所以它就像我在终端上看到的一样。

但是当我对child_process spawn(或exec无关紧要)执行相同操作时,订单会有所不同。

puzzled output

看起来因为stdout数据的大块数据stderr正在所有stdout的正中间打印。

我在下面写的代码:

// 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且来自stderr的微小数据stderr以某种方式在中间被调用时,它会接缝。

这是预期的行为吗?我可以以某种方式解决这个问题,以检索与终端中相同的行为吗?

感谢。 :)

1 个答案:

答案 0 :(得分:1)

process.stdoutprocess.stderr不保证以相对于彼此的任何特定顺序发出数据,因此您已经注意到,只要管道中有任何数据量,就可以调用您的回调

如果您想确保仅在stderr完成后stdout处理stdout.on('end', cb),您可能希望收听stderr.on('data', this.handleData)并仅呼叫cb回调npm ls

那就是说,如果您只想要serval/general/features.h的结果,也许您可​​以考虑尝试use the npm module programmatically?文档并不令人惊讶,但它是一个更高级别的API。