Javascript 如何将实时数据集成到nodeJS和express

Javascript 如何将实时数据集成到nodeJS和express,javascript,node.js,express,firebase,Javascript,Node.js,Express,Firebase,我正在使用express处理我的web应用程序的所有路由。我还使用firebase来存储我的所有数据 所以我想像这样拆分我的代码: index.js:节点应用程序,路由并从firebase获取数据。将数据发送到视图 index.html:显示我的应用程序(视图)并包含client.js client.js:使用index.js(firebase)中的数据,并使用它在index.html中生成图形 我喜欢这种结构,因为index.js负责路由和获取数据,而index.html和client.js负

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

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

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

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

client.js
:使用
index.js
(firebase)中的数据,并使用它在
index.html
中生成图形

我喜欢这种结构,因为
index.js
负责路由和获取数据,而
index.html
client.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,您不能随时向客户端发送数据。客户机必须发出一个特定的请求,然后您可以从该请求返回数据,并且只能在该请求的生命周期内返回数据

因此,对于http,您必须输入http请求以获取一些数据,然后对数据库进行查询,以获取与特定http请求请求相匹配的适当数据

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


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

只是为了确定,这是否意味着我应该使用Firebase获取所有数据,socket.io将数据传输到视图,express处理路由?仅仅在视图中包含firebase不是更容易吗(因此不需要socket.io)?@Vico-我的印象是firebase在您的服务器上,而您的视图在浏览器中。如果服务器上的Firebase发生变化,您需要某种方式更新浏览器中的视图,这需要将数据从服务器发送到客户端,因此您需要某种连续连接才能发送数据。这不是问题的全部症结所在吗?请记住,客户端Javascript是在浏览器中执行的,而不是在服务器上执行的。它存储在服务器上,并在加载页面时发送到浏览器,但它在浏览器中运行。