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