如何将直播数据集成到nodeJS中并表达

How to integrate live data to nodeJS and express

我正在使用 express 处理我的网络应用程序的所有路由。我也在使用 firebase 来存储我所有的数据。

所以我想这样拆分我的代码:

index.js:节点应用程序,路由并从 firebase 获取数据。将数据发送到视图。

index.html:显示我的应用程序(一个视图)并包含 client.js

client.js:使用来自 index.js (firebase) 的数据并使用它在 index.html.

中生成图表

我喜欢这个结构,因为 index.js 负责路由和获取数据,index.htmlclient.js 负责显示。

不幸的是,这个结构并不真正适用于 Firebase。由于 Firebase 在每次修改数据库时都会接收数据,因此此代码:

app.get('/moods/get', function(req, res){
    moodRef.on('value', function(snapshot){
        res.json(snapshot.val());
    })
});

显示此错误:

Error: Can't set headers after they are sent.

我认为这很明显,HTML 页面已经显示,因此尝试发送 json 会产生此错误。

那么解决方法是什么?在 client.js 中使用 firebase,因此它可以实时更新显示,但我的代码结构变得有点奇怪。

client.js现在负责数据,显示,而index.js只负责路由?

最佳做法是什么?您将如何组织此类项目的代码?

提前致谢。

使用http,您不能随心所欲地向客户端发送数据。客户端必须提出特定请求,然后您才能 return 来自该请求的数据,并且只能在该请求的生命周期内使用。

因此,对于 http,您必须提交 http 请求以获取一些数据,然后查询数据库以获取与特定 http 请求所要求的内容相匹配的适当数据。

如果您希望能够在发生变化时向客户端发送数据,那么您可能需要使用 webSocket。使用 webSocket,客户端与服务器建立连接并保持连接有效,然后任何一方都可以向另一方发送消息。在您的特定实例中,只要数据库中发生某些更改,您就可以将该更改传递给每个连接的客户端。当客户端 Javascript 收到此更改时,它可以更新当前显示的页面。

使 webSockets 更容易的一个通用库是 socket.io 库,它与 node.js 配合得很好。在这种情况下,您将在代码中(而不是在请求处理程序中)监听数据库更改,然后在发生更改时将其发送到每个连接的 webSocket。