将持续返回数据的API



这里的初学者,我使用的是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函数记录值,但不返回。

如果您像查看网页一样查看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的中间件使这比现在更容易

云函数中的操作必须是相对短暂的,并以决定性的方式结束。没有办法保持从云功能到客户端的连接打开。

通常考虑是什么触发了发送新数据的需要。例如,如果它是由新用户注册的事实触发的,则可以使用Firebase身份验证触发您的云功能。然后,该函数可以写入实时数据库(或Cloud Firestore(,您的客户端/应用程序会侦听数据库以获取实时更新。这样,您就可以按照设计的方式使用Firebase的所有部分:用于由系统中的事件触发的短暂更新的云函数,以及用于发送实时更新的实时数据库或云Firestore。

如果这对您的用例不起作用,那么您将需要一个允许您保持进程活动的运行时环境。比如App Engine flex、Kubernetes或许多其他选项。

相关内容

  • 没有找到相关文章

最新更新