【问题标题】:Node detect child_process waiting to read from stdin节点检测 child_process 等待从标准输入读取
【发布时间】:2021-02-16 13:26:09
【问题描述】:

我发现了一些关于写入child_process 标准输入的问题,例如Nodejs Child Process: write to stdin from an already initialised process,但是,我想知道是否可以识别使用Node 的child_process 尝试从其读取的进程何时生成标准输入并对其采取行动(可能根据它在此之前写入其标准输出的内容)。

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

是去这里继承Stream 并使用自定义实现覆盖其read 方法还是有更简单的方法?

【问题讨论】:

    标签: node.js stream child-process


    【解决方案1】:

    我已经玩过 Node 标准 I/O 和流一段时间,直到最终找到解决方案。你可以在这里找到它:https://github.com/TomasHubelbauer/node-stdio

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

    开始进程:

    const cp = child_process.exec('node test');
    

    准备一个Readable 并将其通过管道传输到进程的标准输入:

    new stream.Readable({ read }).pipe(cp.stdin);
    

    提供read 实现,当进程要求输入时将调用它:

      /** @this {stream.Readable} */
      async function read(/** @type {number} */ size) {
        this.push(await promise + '\n');
      }
    

    这里promise 用于阻止,直到我们对进程通过其标准输出提出的问题得到答案。 this.push 会将答案添加到Readable 的内部队列中,并最终将其发送到进程的标准输入。

    有关如何解析程序提示的输入、从问题中得出答案、等待提供答案然后将其发送到进程的示例在链接的存储库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多