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