在这里,我正在使用Firebase实时数据库,当添加了某些内容时,我需要我的API不断返回该值,请参见下面的代码。
apiCalls.get('/api/getallusers',function(req,res){
userFunc.getAllUsers(function(err,result){
if (err) return res.status(500).send('internal server error!');
res.status(200).write(JSON.stringify(result));
res.end();
return res;
})
})
这将返回错误
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
但是如果我删除res.end,它将显示1条记录并不断加载,直到页面超时。
这就是我正在做的事情,或者有不同的方法来做到这一点。
我也在为此API使用firebase云功能。
更新:
已上载API,但未返回任何内容...
这是链接https://us-central1-testproject-e6819.cloudfunctions.net/api1/api/getUser
尝试过axios和事件源
Firebase函数记录值,但不返回值。
答案 0 :(得分:1)
如果您正在像浏览网页一样查看API响应,则您的浏览器会缓冲接收到的数据,直到有足够的数据来构成更完整的页面为止。您的浏览器期望内容结束,而不是无尽的数据流。
如果您希望能够继续写入输出流,则应该删除.end()
。
此外,我建议为此使用服务器发送事件(SSE)协议。 https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events它提供了一个很好的基于标准的抽象,这使得在客户端处理事件流变得非常容易。
const eventSource = new EventSource('https://api.example.com/someApi');
eventSource.addEventListener('userupdate', (e) => {
console.log(e.data);
});
在服务器端,有一些基于Express的中间件使它比以前更容易。
答案 1 :(得分:0)
云功能中的操作必须相对短暂,并且必须确定地结束。无法保持从Cloud Functions到客户端的连接保持打开状态。
通常考虑是什么触发了发送新数据的需求。例如,如果它是由新用户注册而触发的,则可以使用trigger your Cloud Functions from Firebase Authentication。然后,该功能可以例如写入实时数据库(或Cloud Firestore),并且您的客户端/应用监听数据库以进行实时更新。这样一来,您就可以按照自己的方式使用Firebase的所有组件:用于从系统中的事件触发的短期更新的Cloud Functions,以及用于发送实时更新的Realtime Database或Cloud Firestore。
如果这不适用于您的用例,则需要一个运行时环境,该环境可以使进程保持活动状态。诸如此类的想法诸如App Engine flex,Kubernetes或许多其他选项。