我正在将数据流式传输到浏览器,如下所示:
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Content-Disposition': 'attachment; filename="data.dat"',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
})
stream1.pipe(res, {end: false)};
stream1.on('end', () => {
console.log("stream 1 finished");
stream2.pipe(res, {end: false});
stream2.on('end', () => {
console.log("last stream finished");
res.end();
}
};
在 Firebase Functions Emulator 上,这工作正常。下载立即开始。
curl -v
立即显示响应标头并开始下载。
但是当我将该函数部署到生产环境时,相同的代码的行为有所不同。下载不会立即开始。
curl -v
甚至不显示响应标头。
客户端的下载只有在服务器完全完成所有流的写入后才开始。当流很大时,客户端得到
Error: could not handle the request
,日志没有错误,表明云函数已完成所有流的写入。
也许这是一些像这样的缓冲配置问题? -> https://stackoverflow.com/a/66656773/176336
您可以参考主题:
云函数的最大运行时间为 540 秒 as 记录在案。您必须考虑使用 Compute 来自 Google Cloud 的引擎实例,您可以在其中运行代码 无限制。或者您可以考虑使用 Google Cloud Scheduler 每 x 次运行你的函数来获取新的推文。
正如线程中提到的:
目前无法按原样传输响应 根据基础设施的实施方式缓冲响应 现在没有办法解决它,这意味着它不会看到 结果直到回复结束。
对于请求,您可以参考文档,其中解释了HTTP函数如何接受HTTP触发器页面上列出的HTTP请求方法。您的 HTTP 处理程序可以检查请求方法并根据该方法执行不同的操作。
有关解决方法,您可以参考线程,提到为:
如果您在 Cloud Functions(无服务器解决方案)上执行此操作,可能会 发现 GAE(App Engine)对于流数据更可行。我们的 应用程序利用 App Engine Standard 作为摄取服务,并且 它就像一个魅力——消除了 GCE 所需的开销。如果高级的话 您的应用程序、App Engine Flexible 或 GKE(Kubernetes 引擎)也可能值得关注!
目前(2022 年 8 月)由于缓冲实现,无法从 Firebase 函数进行流式传输。
我的解决方法是将文件写入 Firebase Storage 并重定向浏览器以从那里下载。
Cloud Run 支持 http 流。因此,如果您在 Cloud Funcitons for Firebase 中使用 http 流式传输
示例代码