为Node.jssubprocess定制标准input

是否有可能在Linux下使用自定义标准input在Node.js中执行subprocess?

文档是指仅供内部使用的stdinStream

有几个内部选项。 特别是stdinStream,stdoutStream,stderrStream。 他们只供内部使用。 与Node中所有未公开的API一样,不应使用它们。

为什么只用于内部使用? 我也试图给我自定义的可读stream,但它产生了一个非常讨厌的V8exception。 使用内部API后没有意外…

一些背景:我需要在Node.js进程closuresstdin之后执行git commit (这是我目前无法解决的问题)。 问题是, 如果你尝试使用一个closures的stdin , Git会非常生气 。

更新:我的问题实际上源于一个Node.js错误 ,但我会在这里保留这个问题,因为我认为我不只是一个想知道这一点。

而不是使用stdinStream ,我认为你应该使用customFds来代替。 从相同的文件:

有一个叫做customFds的弃用选项允许为subprocess的stdio指定特定的文件描述符。 这个API不能移植到所有的平台,因此被删除。 通过customFds,可以将新进程[stdin, stdout, stderr]到现有的stream; -1意味着应该创build一个新的stream。 使用风险自负。

正如它所说,这是由于平台兼容性(我猜Windows)而被弃用。 所以,如果你不想/需要支持Windows,我认为customFds是一个更安全的select,因为虽然它也被弃用,它是API的一部分,而stdinStream从来没有。

那么,你总是可以将任何ReadableStream对象连接到你的ChildProcess对象的stdin属性上(这正是我在我的库节点fluent-ffmpeg中所做的)。

由于在设置inputstream之前,我实际上需要将inputstream设置到stream程中,所以我实际上必须暂停inputstream,以防止数据丢失,直到stream程生成(请参阅此处 ):

 inputstream.pause(); 

只要我开始实际的处理,我简单地恢复stream(见这里 ):

 inputstream.resume(); inputstream.pipe(yourProc.stdin); 

早期版本的节点用于支持customFd,但是这个function在MacOS和Windows下不受支持。 这就是为什么customFd被弃用的原因。