Как передать ответное тело в дочерний процесс, который завершается рано? - PullRequest
0 голосов
/ 16 октября 2018

При запуске

const { spawn } = require('child_process');
const fetch = require('node-fetch');

async function main() {
    const { body } = await fetch('https://i.imgur.com/EhX4JGf.mp4');

    const cp = spawn('dd', [ 'bs=1', 'count=128' ]);

    body.pipe(cp.stdin);

    cp.stdout.pipe(process.stdout);
    cp.stderr.pipe(process.stderr);
}

main();

Я получаю

events.js:183
      throw er; // Unhandled 'error' event
  ^

Error: write EPIPE
    at _errnoException (util.js:992:11)
    at WriteWrap.afterWrite [as oncomplete] (net.js:864:14)

Это, похоже, связано с тем, что дочерний процесс не использует весь ввод (он завершается после использования некоторыхэтого).Если я изменю dd bs=1 count=128 на cat, это будет работать.

Кроме того, не поймите меня неправильно, я не пытаюсь нарезать первые N байтов потока, dd используется какпример программы, которая не читает неограниченные данные.(На самом деле я пытаюсь передать файл в fpcalc -)

РЕДАКТИРОВАТЬ: я пытался игнорировать ошибки EPIPE, как это:

cp.stdin.on('error', err => {
    if (err.code !== 'EPIPE') {
        throw err;
    }
});

Но затем я получил ECONNRESET вместо

Error: read ECONNRESET
    at _errnoException (util.js:992:11)
    at Pipe.onread (net.js:618:25)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...