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

4
如果我查询盒子 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个回答

1
第一个例子可以工作,如果你把你的理论线改成:
- return res.status(200).send(stream);
+ res.writeHead(200, {header: here})
+ stream.pipe(res);

那是有关Node流最好的一点。另一种情况也可以(本质上),但会积累大量不必要的内存。
如果您想检查一个工作示例,这里有一个我基于Scramjet、Express和Browserify编写的示例:

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

这里是从服务器到浏览器的流向。稍作修改后,它将适用于您的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接