我正在编写一些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“用于配置在父进程和子进程之间建立的管道”。因此,我阅读了这篇文章,并期望两次尝试之间不会有任何区别。我想念什么?