如何使用模块child_process在Nodejs中实现一个输入一个输出

时间:2014-10-12 04:08:56

标签: javascript node.js child-process

我尝试让R和nodejs相互通信,但我遇到了一些问题。我会用这段代码解释一下

var cp = require('child_process')
var spawn = cp.spawn

var r = spawn("rterm",["--ess" ,"--slave"])

r.stdout.on('data',function(data){
     console.log(data.toString())
    })

我向子进程发送一个命令,然后子进程生成大量输出(在合理的长度内),由于'data'监听器,Nodejs会自动读回输出。

但是对于子进程,输出是一个块,然后当被Nodejs读回时,它变成两个或更多块有时。这不是我想要的。

如何在我的代码中修复它?

1 个答案:

答案 0 :(得分:0)

当你产生child process时,stdout是Readable Stream。当您附上&{39; data'事件,流进入流动模式',这意味着它将在数据可用时立即返回。当您拥有大量数据时,它会一次返回一个数据块。

有几种方法可以解决这个问题:

你可以缓冲所有的块,并在' end'事件被触发,如下所示:

var output="";
r.stdout.on('data',function(data){
  output+=data
}).on('end',function(){
  console.log(output);
});

或者,您可以完全删除数据事件侦听器并调用stdout.read()

stdout.read()会随时读取流的所有内容,因此当您的流程不再输出任何内容时,您必须调用它。