将传入流转移到发布请求

时间:2019-12-20 10:23:05

标签: node.js http stream

我想将文件从客户端上传到api。 但是,在保存之前必须对文件进行优化, 我开发了一个http服务器来完成这项工作, 我只是使用读取流发送和发布请求,服务器会优化文件。

我要执行的步骤是:

  • [客户端] =>(通过HTTP多段发送文件)
  • => [API] =>(通过HTTP post multipart传输文件)
  • => [OptimizationServer] =>(发送优化文件)
  • => [API] => [保存文件]

问题来自API:

当我发送这样的本地文件时,交互完美地起作用:

const form = new FormData();
form.append('file', fs.createReadStream('./test/audios/test.mp3'));
const file = await new Promise<Buffer>((resolve, reject) => {
  const data = [];
  form.submit({
    host: [SERVER],
    port: [PORT],
    method: 'post',
    path: '/',
    headers: form.getHeaders(),
  }, (err, res) => {
    res.on('data', (buffer) => {
      resolve(buffer);
    });
  });
});

在这种情况下,一切正常。 但是,我需要做的是将传入流传输到OptimizationServer 。 所以,我替换了行

form.append('file', fs.createReadStream('./test/audios/test.mp3'));
form.append('file', await inputFile.createReadStream());

在这种情况下,OptimizationServer会捕获错误:

Error: Part terminated early due to unexpected end of multipart data
Emitted 'error' event on FileStream instance at: 
[...] \node_modules\dicer\lib\Dicer.js:65:36

传入流与fs.createReadStream之间确实存在差异。 我已经打印了这些流进行比较:

fs.writeFileSync('./tmp/normalStream.json',  JSON.stringify(fs.createReadStream('./test/audios/test.mp3')));
fs.writeFileSync('./tmp/incomingStream.json', JSON.stringify(await audioInput.file.createReadStream()));

主要区别是incomingStream获得属性_writeStream而不是normalStream

有人可以通过http请求传输普通流吗?

0 个答案:

没有答案