Node.js 节点检测等待从stdin读取的子进程

Node.js 节点检测等待从stdin读取的子进程,node.js,stream,child-process,Node.js,Stream,Child Process,我发现了一些关于写入child\u进程标准输入的问题,例如,我想知道,当一个进程使用节点的child\u进程尝试读取其标准输入并对其采取行动时,是否可以识别该进程(可能是根据之前它写入标准输出的内容) 我看到stdio流是在Node中实现的。流有一个名为data的事件,该事件用于它被写入的时间,但是,我没有看到用于检测流被读取的事件 在这里,是通过自定义实现子类Stream并覆盖其read方法,还是有更简单的方法?我已经对节点标准I/O和streams进行了一段时间的研究,直到最终找到了解决方案

我发现了一些关于写入
child\u进程
标准输入的问题,例如,我想知道,当一个进程使用节点的
child\u进程
尝试读取其标准输入并对其采取行动时,是否可以识别该进程(可能是根据之前它写入标准输出的内容)

我看到stdio流是在Node中实现的。流有一个名为
data
的事件,该事件用于它被写入的时间,但是,我没有看到用于检测流被读取的事件


在这里,是通过自定义实现子类
Stream
并覆盖其
read
方法,还是有更简单的方法?

我已经对节点标准I/O和streams进行了一段时间的研究,直到最终找到了解决方案。您可以在这里找到它:

其要点是,我们需要创建一个
可读的
流,并通过管道将其传输到流程的标准输入。然后我们需要监听流程的标准输出并对其进行解析,检测感兴趣的块(向用户提示),每次我们得到其中一个块时,让
可读的
输出我们的“反应”至流程标准输入的提示

启动流程:

const cp = child_process.exec('node test');
准备一个可读的
,并将其导入流程的标准输入:

new stream.Readable({ read }).pipe(cp.stdin);
提供
read
实现,当流程请求输入时将调用该实现:

/**@此{stream.Readable}*/
异步函数读取(/**@type{number}*/size){
this.push(等待承诺+'\n');
}
这里,
promise
用于阻止,直到我们对流程通过其标准输出提出的问题有了答案。
这个。push
将把答案添加到
可读的内部队列中,并最终将其发送到流程的标准输入

链接存储库中有一个示例,说明如何解析程序提示符的输入、从问题中得出答案、等待答案提供,然后将其发送到流程