Nodejs child_process spawn get 命令运行

问题描述 投票:0回答:3

为了澄清目的,我想查看 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
返回的对象有子对象:
stdout
stdin
stderr
。有
stderr
stdout
用作事件发射器的示例,这些工作正常,但我找不到
stdin
发出的事件...

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

node.js command-line event-handling child-process
3个回答
0
投票

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));

0
投票

注意一个警告:在当前进程的情况下,process.stdin 是stream.Readable 的实例,process.stdout 是stream.Writable 的实例,但是,在引用生成的子进程的情况下,情况相反:child.stdin 是一个stream.Writable,而child.stdout 是一个stream.Readable。

顺便说一句,对于节点中流的粉丝研究,我建议参加有趣的流冒险课程;)


-1
投票

这里的问题是 stdin 是一个只写 unix 套接字。您可以写入子级标准输入,但如果您想检测任何类型的格式,则必须在标准输出的数据事件上发生。

your app ----> stdin of child (can only write to it)

your app <---- stdout of child (can only read from it)

我希望我解释了我的观点你满意吗?如果没有,请举例说明为什么您想查看外部程序收到哪些标准输入消息。 (如果有办法,那么我怀疑您将返回的只是您写入的相同数据)

© www.soinside.com 2019 - 2024. All rights reserved.