如果我查询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);
});
});
}
答案 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可以解决您的问题。