【发布时间】:2017-12-07 01:54:45
【问题描述】:
我认为这很简单,但以下内容无法按预期工作。
我想将数据从 Node 传送到一个进程,例如(只是一个任意命令)wc。
docs 和其他 SO questions 似乎表明传递 Stream 应该可以工作:
const {spawnSync} = require('child_process')
const {Readable} = require('stream')
const textStream = new Readable()
textStream.push("one two three")
textStream.push(null)
const stdio = [textStream, process.stdout, process.stderr]
spawnSync('wc', ["-c"], { stdio })
不幸的是,这会引发错误:
选项“stdio”的值“Readable { ... } 无效
relevant bit of code from internal/child_process.js 不会立即透露预期的有效选项是什么。
【问题讨论】:
-
这很有趣!我只是通过将数据直接传递给
input选项而不是重新分配stdin来使其工作。 -
“请注意,流必须具有底层描述符”。我不认为你的
textStream有一个。 -
谢谢@robertklep——我也注意到了;从我读过的所有内容来看,不清楚为什么需要描述符,它是如何实现/与常规流区分开来的,或者在任何情况下如何解决它。这是一个奇怪的、看似武断的要求。
-
这不是任意的,因为这就是管道(基本上是您要构建的)的工作方式:它们连接文件描述符。但是,将数据管道传输到进程和
spawnSync的组合也没有任何意义,因为外部程序是同步执行的(因此在它开始和结束之间你不能通过管道传输任何东西)。也许您想使用input选项? -
谢谢@robertklep——
input选项在这里看起来是正确的答案。另外:正确的解决方案应该是恕我直言,stdio[0]应该在抽象流接口的任何兼容实现上都有效;无论是来自套接字、文件、管道还是任何其他可读接口; spawn 的同步性是一个wait用于 spawn 退出 - 但这不会抑制生成的进程,例如从标准输入永远读取。对带有描述符的流的限制似乎是一个任意的技术警告,而不是服务于合理目标的原则性设计选择。可能是错的:)
标签: node.js node-streams