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

How do I realize One Input One Output in Nodejs with the module child_process

本文关键字:实现 输入 输出 Nodejs child 何使用 process 模块      更新时间:2023-09-26

我试图让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()将在任何时候读取流的所有内容,因此您必须在进程不再输出任何内容时调用它。