1

我正在编写一些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“用于配置在父进程和子进程之间建立的管道”。所以,我读了这篇文章,并预计两次尝试之间没有区别。我错过了什么?

4

0 回答 0