NodeJS направляет дочерний стандарт на ответ;потеряны первые байты highWaterMark выходного потока - PullRequest
0 голосов
/ 06 февраля 2019

Я писал код для nodejs, чтобы открыть поток чтения файла, передать его потомку, созданному с помощью spawn (), а затем направить stdout дочернего элемента к ответу.Я решил свою проблему;Я публикую это, чтобы помочь другим, а также потому, что не понимаю, почему один способ сработал, а другой нет.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...