2014-02-21 36 views
1

我写了一个简单的测试脚本的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特殊性,我还没有整理出来。

+0

CRLF会对内容有任何影响吗? –

+1

请记住,PHP正在异步执行此过程,并且您似乎未尝试确定执行是否已完成。你可能想利用['stream_get_meta_data()'](http://us2.php.net/manual/en/function.stream-get-meta-data.php)的'eof'来检查过程是否关闭了输出管道。 – Sammitch

+0

@Sammitch - 也许这就是问题所在:当仍然存在未决的缓冲输出时,命令结束并生成状态码(甚至有可能?); ['console' docs](http://nodejs.org/docs/latest/api/console.html#console_console)建议有这方面的内容。但我刚刚尝试了'util.puts()',它[据说是同步](http://nodejs.org/docs/latest/api/util。html#util_util_puts),我仍然只有第一行。 –

回答

1

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

出口

一种process.exit更换,以确保标准输入输出都退出之前完全耗尽 。

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

请参阅Node.js issue #3584作进一步参考。

利用这种包,这取代:

process.exit(33); 

...与此:

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

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

0

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

+0

我试过了(我不再说这个或那是不可能的),但没有任何改变。事实上,通过'console.log()','console.error()','util.puts()'自动插入新的行......如果我做了'console.log(“One \ nTwo \ nThree” )'我得到三条输出行(但只有那些来自第一个'console.log()'实例的行)。 –