如何将实时数据集成到nodeJS并表达

时间:2015-09-25 04:00:40

标签: javascript node.js express firebase

我正在使用快递来处理我的网络应用程序的所有路由。我也使用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只负责路由?

最佳做法是什么?你会如何组织这类项目的代码?

提前致谢。

1 个答案:

答案 0 :(得分:3)

使用http,您无法随时将数据发送到客户端。客户端必须发出特定请求,然后您才能从该请求返回数据,并且仅在该请求的生命周期内返回。

因此,对于http,您必须对http请求进行字段处理以获取一些数据,然后对数据库进行查询以获取与特定http请求所要求的匹配的相应数据。

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

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