node.js - Nodejs child_process spawn get命令运行

标签 node.js command-line event-handling child-process

为了清楚起见,我想查看 Node.js 与 shell/cli 运行的确切命令。不幸的是,我似乎无法找出如何......

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

从这里返回的对象是一个事件发射器,但是目前在 Nodejs 中没有办法从事件发射器中嗅探事件。我尝试了 data &, pipe 事件但没有成功。

child_process.spawn 返回的对象有子对象:stdoutstdinstderr。有 stderrstdout 被用作事件发射器的例子,这些工作正常,但我找不到 stdin 发出的事件。 .

我知道我可以接受我的输入并对其进行格式化,但这感觉很容易失败/不一致,所以我更愿意找到一种方法来嗅探它实际使用的内容。

最佳答案

stdin 上有一个名为 "data" 的传入数据事件

process.stdin.on("data", (data) => {} );
  • 虽然一些应用程序逐行处理输入,但其他应用程序更具交互性并实时处理按键(例如,用于在列表中向上/向下移动的箭头键)。
  • 虽然一些应用程序需要纯文本,但其他应用程序将使用二进制数据。

面对各种各样的可能场景,您几乎只能靠自己了。 我通常会创建一个 InputReader,它只是缓冲所有输入并将其转换为适合我的特定用例的事件。

下面是一个最基本的阅读器示例,它在每次接收到一行文本时触发事件。

export class DataReader {
  private buffer = "";

  constructor(private listener: (err, line: string)=>any ) {
  }

  processData(data) {
    // remove carriage returns, and add data to the buffer.
    data = data.toString().replace(/\r/g, '');
    this.buffer += data;

    // get only the complete data.
    const lastNewlineIndex = this.buffer.lastIndexOf('\n');
    if (lastNewlineIndex < 0) return;
    
    if (this.listener != null) {
      // split data in lines
      const completeData = this.buffer.slice(0, lastNewlineIndex);
      const lines = completeData.split('\n');
      for (const line of lines) {
        // notify listener line by line.
        this.listener(null, line);
      }
    }
    
    // remove processed data from the buffer.
    this.buffer = this.buffer.slice(lastNewlineIndex + 1);
  }
}

实际上,您可以使用 EventEmitter 或某些 Observable 来调度输出。

const reader = new DataReader((err, line) => subject.next(line));
process.stdin.on("data", (data) => reader.processData(data));

关于node.js - Nodejs child_process spawn get命令运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35609826/

相关文章:

windows - 为什么在使用 ENABLEDELAYEDEXPANSION 时这个变量不会在 for 循环中设置?

windows - 使用命令行/批处理切换到/专注于应用程序

command-line - 如何在 postgreSQL linux 中执行多个 sql 文件?

javascript - 修改req.url不会更新url参数(req.query)

node.js - 使用shell.openItem()在asar文件中打开文件

javascript - 如何使用自定义查询方法延长水线?

javascript - touchstart 处理程序后的 touchmove 处理程序将无法工作

一个元素的 jQuery onfocus 有另一个元素可点击

asynchronous - 微服务客户端确认和事件溯源

node.js - 如何在 Ubuntu 上检查和更改 Nodejs 版本?