NodeJS将子标准输出管道传递给响应;输出流的前highWaterMark字节丢失

时间:2019-02-06 19:35:31

标签: node.js nodejs-stream

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

0 个答案:

没有答案