Nodejs:如何向浏览器发送可读流

use*_*718 6 node.js box

如果我查询框 REST API 并返回一个可读流,处理它的最佳方法是什么?怎么发送到浏览器呢?(免责声明:我对流和缓冲区很陌生,所以其中一些代码非常理论化)

你能在响应中传递readStream并让浏览器处理它吗?或者您是否必须将块流式传输到缓冲区然后发送缓冲区?

export function getFileStream(req, res) {
  const fileId = req.params.fileId;
  console.log('fileId', fileId);
  req.sdk.files.getReadStream(fileId, null, (err, stream) => {
    if (err) {
      console.log('error', err);
      return res.status(500).send(err);
    }
    res.type('application/octet-stream');
    console.log('stream', stream);
    return res.status(200).send(stream);
  });
}
Run Code Online (Sandbox Code Playgroud)

会 ^^ 工作,或者你需要做类似的事情:

export function downloadFile(req, res) {
  const fileId = req.params.fileId;
  console.log('fileId', fileId);
  req.sdk.files.getReadStream(fileId, null, (err, stream) => {
    if (err) {
      console.log('error', err);
      return res.status(500).send(err);
    }
    const buffers = [];
    const document = new Buffer();
    console.log('stream', stream);
    stream.on('data', (chunk) => {
      buffers.push(buffer);
    })
    .on('end', function(){
      const finalBuffer = Buffer.concat(buffers);
      return res.status(200).send(finalBuffer);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*cki 1

如果您将理论行更改为:

- return res.status(200).send(stream);
+ res.writeHead(200, {header: here})
+ stream.pipe(res);
Run Code Online (Sandbox Code Playgroud)

这就是节点流最好的事情。另一种情况(本质上)也可以工作,但它会积累大量不必要的内存。

如果您想查看一个有效的示例,这是我基于 scramjet、express 和 browserify 编写的示例:

https://github.com/MichalCz/scramjet/blob/master/samples/browser/browser.js

您的流从服务器到浏览器的路径。通过一些小的修改,它就能解决你的问题。