如果我查询框 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)
如果您将理论行更改为:
- 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
您的流从服务器到浏览器的路径。通过一些小的修改,它就能解决你的问题。
| 归档时间: |
|
| 查看次数: |
8383 次 |
| 最近记录: |