NodeJS направляет дочерний стандарт на ответ; потеряны первые байты highWaterMark выходного потока

Я писал код для 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, то ему не хватало первых 64 КБ байтов (я полагаю, по умолчанию).

Моя вторая попытка сработала:

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 или "pipe". В нем также говорится, что stdio "используется для настройки каналов, которые устанавливаются между родительским и дочерним процессами". Итак, я прочитал это и не ожидал никакой разницы между двумя попытками. Что мне не хватает?

0 ответов

Другие вопросы по тегам