我试图让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())
})
我向子进程发送一个命令,然后子进程生成大量输出(在合理的长度内),输出由Nodejs自动读取,因为"data"监听器。
但对于子进程,输出是一个块,然后当Nodejs读回时,它有时会变成两个或多个块。这不是我想要的。
如何在代码中修复此问题?
当您生成一个子进程时,stdout是一个可读流。当您附加"数据"事件时,流将进入"流动模式",这意味着它将在数据可用时立即返回数据。当你有很多数据时,它会一次一块地返回你的数据。
有几种方法可以解决这个问题:
您可以缓冲所有块,并在"结束"事件触发时输出它们,如下所示:
var output="";
r.stdout.on('data',function(data){
output+=data
}).on('end',function(){
console.log(output);
});
或者,您可以完全删除数据事件侦听器并调用stdout.read().
stdout.read()将在任何时候读取流的所有内容,因此您必须在进程不再输出任何内容时调用它。