我只能捕获Node.js脚本的第一个输出行

我已经为Node.js写了一个简单的testing脚本:

console.log("Line #1 stdout"); console.log("Line #2 stdout"); console.log("Line #3 stdout"); console.error("Line #1 stderr"); console.error("Line #2 stderr"); console.error("Line #3 stderr"); process.exit(33); 

我需要从PHP脚本中捕获完整的输出,但不pipe我尝试什么,我只能得到每个stream的第一行:

 var_dump(`node test.js 2>&1`); exec('node test.js 2>&1', $output); var_dump($output); $descriptorspec = array( 1 => array('pipe', 'w'), // stdout 2 => array('pipe', 'w'), // stderr ); $process = proc_open('node test.js', $descriptorspec, $pipes); var_dump(stream_get_contents($pipes[1])); var_dump(stream_get_contents($pipes[2])); proc_close($process); 
 string(30) "Line #1 stdout Line #1 stderr " array(2) { [0]=> string(14) "Line #1 stdout" [1]=> string(14) "Line #1 stderr" } string(15) "Line #1 stdout " string(15) "Line #1 stderr " 

我是否错过了console对象的一些基本概念?

编辑:这不是严格的PHP问题; 在命令行中也是如此:

 C:\test>node test.js 2>&1 | sort /r Line #1 stdout Line #1 stderr 

它必须是一个Node.js的特殊性,我还没有整理出来。

这显然是Node.js中的一个已知问题。 甚至有一个包来解决它 :

出口

process.exit的替代,确保stdio在退出之前完全耗尽。

长话短说,如果在Windows上调用process.exit,那么在管道重定向stdout或stderr时,脚本输出通常会被截断。 这个模块试图通过等到这些流完全耗尽之前,实际调用process.exit来解决这个问题。

请参阅Node.js问题#3584以作进一步参考。

用这样的包装,取代这个:

 process.exit(33); 

… 有了这个:

 var exit = require('exit'); exit(33); 

…产生预期的行为:在过程结束之前刷新控制台输出。

我不确定你正在使用哪个代码编辑器,但是你可能想要检查行结束符。 例如,在Sublimetext 3中,可以选择节点test.js(也可以转义字符串节点\ test.js),并确保它们是Unix行尾。 这将通过查看 – >行结束。