我正在编写一些nodejs代码来打开一个文件读取流,将它传递给一个用spawn()制作的孩子,然后将孩子的标准输出传递给响应。我解决了我的问题;我发布这个是为了帮助别人,也是因为我不明白为什么一种方式有效而另一种方式无效。
我的第一次尝试是:
const fs = require('fs');
const spawn = require('child_process').spawn;
var fstream= fs.createReadStream('/tmp/whatever_binary_file.exe, {highWaterMark: 1024});
fstream.on('open', function () {
const child = spawn(
'./scripts/do_stuff.pl',
[arg1,arg2,arg3 ],
{
stdio: [fstream,'pipe' ,process.stderr]
}
);
child.stdout.pipe(res);
});
这不起作用,响应中的输出文件总是缺少它的第一个 highWaterMark 字节。如果我删除了 highWaterMark 选项,那么它会丢失它的前 64KB 字节(我猜是默认值)。
我的第二次尝试奏效了:
const fs = require('fs');
const spawn = require('child_process').spawn;
var fstream= fs.createReadStream('/tmp/whatever_binary_file.exe, {highWaterMark: 1024});
fstream.on('open', function () {
const child = spawn(
'./scripts/do_stuff.pl',
[arg1,arg2,arg3 ],
{
stdio: ['pipe','pipe' ,process.stderr]
}
);
fstream.pipe(child.stdin);
child.stdout.pipe(res);
});
但为什么?这两次尝试之间究竟有什么区别?stdio 选项文档说我可以传递一个 Stream 对象或“管道”。它还说stdio“用于配置在父进程和子进程之间建立的管道”。所以,我读了这篇文章,并预计两次尝试之间没有区别。我错过了什么?