Node.js子进程的自定义stdin

时间:2012-03-07 13:00:05

标签: linux node.js

是否可以在Linux下使用自定义stdin在Node.js中执行子进程?

documentionstdinStream,仅供内部使用:

  

有几个内部选项。特别是stdinStream,   stdoutStream,stderrStream。它们仅供内部使用。和。一样   Node中的所有未记录的API都不应该使用它们。

为什么它只供内部使用?我也试图给它自定义的readableStream,但它产生了一个非常令人讨厌的V8异常。使用内部API后就不足为奇了......

一些背景知识:我需要在Node.js进程关闭stdin之后执行git commit(这是我目前无法解决的问题)。问题是Git gets very angry at you if you try to commit with a closed stdin

更新:我的问题实际上来自a Node.js bug,但我会在这里提出这个问题,因为我认为我不仅仅是在想这个问题。

2 个答案:

答案 0 :(得分:1)

好吧,你总是可以将任何ReadableStream对象传递给你的ChildProcess对象的stdin属性(这正是我在我的库node-fluent-ffmpeg中所做的)。

由于我在实际将其输入到进程之前将输入流设置为一些调用,所以我实际上必须在我的选项中设置后立即暂停输入流,以防止数据丢失,直到生成该进程为止(请参阅{{ 3}}):

inputstream.pause();

一旦我开始实际处理,我只需恢复流(见here):

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

早期版本的节点用于支持customFd,但MacOS和Windows也不支持此功能。这就是为什么customFd被弃用了。

答案 1 :(得分:1)

我认为您应该使用stdinStream而不是customFds。来自相同的文档:

  

有一个名为customFds的已弃用选项,它允许为子进程的stdio指定特定的文件描述符。此API无法移植到所有平台,因此已删除。使用customFds,可以将新进程“[stdin, stdout, stderr]连接到现有流; -1意味着应该创建一个新流。使用风险自负。

正如它所说,由于平台兼容性(我猜测Windows),这已被弃用。因此,如果您不希望/需要支持Windows,我认为customFds是一个更安全的选择,因为虽然它也被弃用,但它是API的一部分,而stdinStream从未如此。