【问题标题】:Firebase control server for maintaining counters and aggregates用于维护计数器和聚合的 Firebase 控制服务器
【发布时间】:2017-06-20 00:03:19
【问题描述】:
这是一个known issue,firebase 没有简单的方法来计算项目。我计划创建一个严重依赖计数和其他聚合的应用程序。我担心按照here 建议的规则创建这个应用程序的计数器会非常复杂且难以维护。
所以我想到了这个模式:
我将保留一个服务器,该服务器将侦听数据库中输入的所有项目,该服务器将更新所有计数器和聚合。服务器将保存一个特殊管理员的 UID,只有他可以更新计数器。
这样,用户不必下载整个节点来获得计数,而且我不必处理客户端维护计数器所产生的问题。
这种模式有意义吗?我错过了什么吗?
【问题讨论】:
标签:
firebase
firebase-realtime-database
【解决方案1】:
Firebase 最近发布了 Cloud Functions。正如documentation中提到的:
Cloud Functions 是一个托管、私有且可扩展的 Node.js 环境
您可以在其中运行 JavaScript 代码。
使用 Cloud Functions,您无需创建自己的服务器。您可以简单地编写 JavaScript 函数并将其上传到 Firebase。 Firebase 将负责在事件发生时触发函数。
例如,假设您要计算帖子中的点赞数。你应该有一个类似于这个的结构:
{
"Posts" : {
"randomKey" : {
"likes_count":5,
"likes" : {
"userX" : true,
"userY" : true,
"userZ" : true,
...
}
}
}
}
你的 JavaScript 函数会这样写:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
// Keeps track of the length of the 'likes' child list in a separate attribute.
exports.countlikes = functions.database.ref('/posts/$postid/likes').onWrite(event => {
return event.data.ref.parent().child('likes_count').set(event.data.numChildren());
});
每当likes 节点上有新的写入时,此代码都会增加likes_count 变量。
此示例可在GitHub 获得。