如何通过管道将响应主体传递到早期退出的子进程?

时间:2018-10-16 13:48:17

标签: javascript node.js stream fetch-api nodejs-stream

运行时

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)

0 个答案:

没有答案