gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:16:25 24 4
gpt4 key购买 nike

为了清楚起见,我想查看 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com