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

时间:2016-11-02 18:47:54

标签: 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);
  });
}

^^会起作用,还是需要做类似的事情:

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);
    });
  });
}

1 个答案:

答案 0 :(得分:3)

如果您将理论线更改为:

,第一个示例将起作用
- return res.status(200).send(stream);
+ res.writeHead(200, {header: here})
+ stream.pipe(res);

这是关于节点流的最好的事情。另一种情况(实质上)也会起作用,但会积累大量不必要的记忆。

如果你想查看一个有效的例子,我在这里写的是基于scramjet,express和browserify的文章:

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

您的流从服务器到浏览器的位置。使用较小的mods可以解决您的问题。