为了澄清目的,我想查看 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));
注意一个警告:在当前进程的情况下,process.stdin 是stream.Readable 的实例,process.stdout 是stream.Writable 的实例,但是,在引用生成的子进程的情况下,情况相反:child.stdin 是一个stream.Writable,而child.stdout 是一个stream.Readable。
顺便说一句,对于节点中流的粉丝研究,我建议参加有趣的流冒险课程;)
这里的问题是 stdin 是一个只写 unix 套接字。您可以写入子级标准输入,但如果您想检测任何类型的格式,则必须在标准输出的数据事件上发生。
your app ----> stdin of child (can only write to it)
your app <---- stdout of child (can only read from it)
我希望我解释了我的观点你满意吗?如果没有,请举例说明为什么您想查看外部程序收到哪些标准输入消息。 (如果有办法,那么我怀疑您将返回的只是您写入的相同数据)