Node.js 将文本作为 `spawnSync` 的标准输入传递
Posted
技术标签:
【中文标题】Node.js 将文本作为 `spawnSync` 的标准输入传递【英文标题】:Node.js pass text as stdin of `spawnSync` 【发布时间】: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 退出 - 但这不会抑制生成的进程,例如从标准输入永远读取。对带有描述符的流的限制似乎是一个任意的技术警告,而不是服务于合理目标的原则性设计选择。可能是错的:)
【参考方案1】:
要将特定数据显示为子进程的stdin
数据,您可以使用input
选项:
spawnSync('wc', ['-c'], input : 'one two three' )
【讨论】:
以上是关于Node.js 将文本作为 `spawnSync` 的标准输入传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Node JS 中读取文本文件并将其作为 JSON 对象返回?