我正在使用快递来处理我的网络应用程序的所有路由。我也使用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
只负责路由?
最佳做法是什么?你会如何组织这类项目的代码?
提前致谢。
答案 0 :(得分:3)
使用http,您无法随时将数据发送到客户端。客户端必须发出特定请求,然后您才能从该请求返回数据,并且仅在该请求的生命周期内返回。
因此,对于http,您必须对http请求进行字段处理以获取一些数据,然后对数据库进行查询以获取与特定http请求所要求的匹配的相应数据。
如果您希望能够在发生变化时将数据发送到客户端,那么您可能希望使用webSocket。使用webSocket,客户端建立与服务器的连接并保持连接活动,然后任何一方都可以向另一方发送消息。在您的特定实例中,只要数据库中发生更改,您就可以将更改传递给每个连接的客户端。当客户端Javascript收到此更改时,它可以更新当前显示的页面。
使用webSockets更简单的公共库是socket.io库,它与node.js配合得很好。在这种情况下,您可以在代码中(而不是在请求处理程序中)监听数据库更改,然后在发生这种情况时,将其发送到每个连接的webSocket。