为什么NodeJS在等待片刻时关闭进程的标准输出?

时间:2018-11-21 07:12:37

标签: node.js stream pipe

const p = spawn('ls', ['/'])
console.log('$mark$')
p.stdout.pipe(process.stdout)

上面的代码准确打印了根目录的文件列表,即:

$mark$
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
solr.log
srv
sys
tmp
usr
var

但是,如果我等待片刻(例如1秒),它什么也不会打印。代码如下:

const p = spawn('ls')
setTimeout(() => {
  console.log('$mark$')
  p.stdout.pipe(process.stdout)
}, 1000)

仅打印:

$mark$

我想知道为什么第二个代码不显示ls命令的任何内容。

环境:

  • Linux:openSUSE Leap 42.3
  • 节点:v8.11.1

1 个答案:

答案 0 :(得分:0)

在第二个代码示例中,ls的输出在您尝试处理输出并通过管道传输时已经完成了很长时间。 Node.js通常不会为您缓冲未使用的管道。您必须在输出开始之前通过管道传输它,否则将丢失数据,或者必须.pause()