Nodejs:如何发送一个可读的stream到浏览器

如果我查询框REST API并获取可读的stream,处理它的最佳方法是什么? 你怎么把它发送到浏览器? (免责声明:我是新来的stream和缓冲区,所以这些代码是相当理论)

你可以在响应中传递readStream并让浏览器处理它吗? 还是你必须stream块大块缓冲区,然后发送缓冲区?

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

第一个例子会工作,如果你改变你的理论线:

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

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

如果你想检查一个工作的例子,这里是我基于超燃冲压发动机,expression和browserify:

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

您的stream从服务器到浏览器的位置。 使用较小的mods会适合你的问题。