为了清楚起见,我想查看 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
发出的事件。 .
我知道我可以接受我的输入并对其进行格式化,但这感觉很容易失败/不一致,所以我更愿意找到一种方法来嗅探它实际使用的内容。
最佳答案
在 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/