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

时间:2014-02-21 21:29:43

标签: javascript php windows node.js

我为Node.js编写了一个简单的测试脚本:

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脚本中捕获其完整输出,但无论我尝试什么,我只获得每个流的第一行:

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特殊性。

3 个答案:

答案 0 :(得分:1)

这显然是Node.js中的一个已知问题。甚至有a package to fix it

  

退出

     

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

     

简而言之,如果在Windows上调用process.exit,   管道重定向stdout或时,脚本输出经常被截断   标准错误。此模块尝试通过等待来解决此问题   直到那些溪流实际上已完全耗尽   调用process.exit。

     

有关详细信息,请参阅Node.js issue #3584

使用这样的包,替换它:

process.exit(33);

......用这个:

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

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

答案 1 :(得分:1)

仅供参考,这只是在Windows上出现问题,但我刚刚在Linux(确切地说是Oracle Linux 7.4)上遇到过Node 8.11.1。

我的程序正在生成723行输出,输出到终端或重定向到文件,但如果通过管道传输到更少或tee(在导致大量浪费的调试时间),则会在第333行截断。

提到的退出包解决了我。

答案 2 :(得分:-1)

我不确定您使用的代码编辑器,但您可能需要检查行结尾。例如,在Sublimetext 3中,您可以选择节点test.js(并且可能转义该字符串node \ test.js)并确保它们是Unix行结尾。那将是通过视图 - >线路结束。