鉴于一系列聊天室和一系列聊天室元数据,我如何安全地更新两个聊天室?

时间:2016-10-18 10:23:34

标签: angularjs firebase websocket firebase-realtime-database angularfire

要练习将Firebase用于大型应用程序,我正在制作一个Firebase应用程序,其中包含多个聊天室,类似于Firechat

理论上可能有数百万个聊天室,每个聊天室都有数百万条消息。

我希望能够显示聊天室名称列表,包括每个聊天室的一些元数据,例如参与者数量。

从编码角度来看,最简单的方法是加载所有聊天室,但这可能是大量的数据。

我的解决方案是拥有一个Chat s数组和一个ChatInfo数组。前者将包含所有聊天消息,后者将包含有关每个聊天的元数据。

我的问题是:如何更新一个数组中的项目并确保其他数组中的相应项目也在不依赖客户端的情况下进行更新?

我目前的解决方案是:

var chatData = {room_name: "Test Room"}
var chat = Chat.ref.push(chatData);
var chatMeta = ChatMeta.ref.push(chatData);
chat.update({chat_meta_id: chatMeta.key});
chatMeta.update({chat_id: chat.key});

这很有效。但是,我感觉像它过分依赖客户端

例如:如果客户端的Firebase连接在创建Chat之后但在创建ChatMeta之前死亡怎么办?当然,Firebase几乎可以快速实现,但依靠前端代码在后端进行同步会让人感觉不好。

一种解决方案是让所有“写入”请求通过我控制的后端服务器,然后转到Firebase。但整个“没有后端!”对Firebase来说,这是一个很大的卖点,我想知道是否可以避免这种情况。

在我看来,应该有一些方法对所有不同的Chat项进行“浅层”查询,这样就不需要保留ChatMeta数据的运行列表,或某种类型的Firebase结束时设置的规则会在ChatMeta更新时更新Chat。但是,这些似乎都不存在。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用Cloud Functions,您可以避免过多依赖客户端拥有受控制的后端服务器。

在这种情况下,您需要创建一个HTTP TRIGGER功能,然后从客户端将room_name推送到该功能。云功能将执行您的要求并返回ChatMeta对象。