firebase 统计在线用户并在全球计数器中更新
Posted
技术标签:
【中文标题】firebase 统计在线用户并在全球计数器中更新【英文标题】:firebase count online users and update in global counter 【发布时间】:2018-11-19 18:13:36 【问题描述】:我想计算firebase中的在线用户并将值存储在firebase中的online_users下,当用户连接到应用程序以增加online_users以及当用户从应用程序断开连接以减少时。 我建立了firebase功能
export const countOnlineUser = functions.database
.ref('/UserStatus/uid')
.onWrite((change, context) =>
var collectionRef = change.after.ref.parent;
var countRef = collectionRef.child('online_users');
let increment = 0;
if (change.after.exists() && !change.before.exists())
increment = 1;
else if (!change.after.exists() && change.before.exists())
increment = -1;
else
return null;
// Return the promise from countRef.transaction() so our function
// waits for this async event to complete before it exits.
return countRef.transaction((current) =>
console.log(current)
if (current == null)
return 0;
else
return (current || 0) + increment;
).then(() =>
return console.log('Counter updated.');
);
);
每次用户连接到应用程序时客户端更新用户
constructor()
firebase.auth().onAuthStateChanged((user) =>
if (user)
const uid, phoneNumber = firebase.auth().currentUser._user
UserStore.setUID(uid)
this.setListenConnection()
)
setListenConnection = async () =>
this.userStatusDatabaseRef = firebaseRef(`UserStatus/$UserStore.user.uid`)
firebaseRef('.info/connected').on('value', async connected =>
if (connected.val() === false)
return
await firebaseRef(`UserStatus/$UserStore.user.uid`).onDisconnect().remove()
this.userStatusDatabaseRef.set( state: 'online', last_changed: firebase.firestore.FieldValue.serverTimestamp() , merge: true )
)
我对这些功能有一些疑问 有时 online_users 是负面的,我想阻止它。 有时我得到的交易电流是空的。
我该如何解决?
【问题讨论】:
您似乎已经从functions-samples repo) 那里得到了基本计数器,众所周知,它非常可靠。解决问题的关键是弄清楚它何时发生。 当前代码中的一个错误是您假设每个用户只有一个连接。这根本无法保证。用户可以在多台设备上使用该应用程序,甚至可以在一台设备上使用多个连接(尽管只有一个活动连接)。我强烈建议您遵循文档中的模式,该模式为每个连接使用一个推送 ID:firebase.google.com/docs/database/web/…。 “连接到应用程序”究竟是什么意思? @FrankvanPuffelen 我通过保存具有唯一设备 ID 的 uid 解决了以其他方式连接多个设备的问题。这样用户就不能在多个设备中使用其他设备。当他尝试时,它会将他从第二台设备中抛出并使用 firebase 退出。我试图了解我的功能有什么不好的地方。我检查了你在functions-sample中发布的例子,它看起来就像我所做的一样...... 另一种方法是采用不同的计数方法。您复制的函数示例尝试计算增量,因此将 +1 和 -1 计算为添加/删除的项目。您还可以在发生更改时简单地重新计算所有子节点,方法是触发/UserStatus
,然后简单地将值写入countRef.set(change.after.numChildren())
。它更简单,并且(虽然效率不高)将查找扩展到几十万在线用户(只要您每次使用的数据很少)。
【参考方案1】:
Performance Monitoring 公开会话或当前用户,但它似乎仅适用于移动应用程序 (ios/android)。
Google Analytics for Firebase 数据收集通过 Google Analytics for Firebase 收集的信息类型
默认实现包括:
用户和会话数 会话持续时间 操作系统 设备型号 地理 首次发布 应用打开 应用更新 应用内购买
关于云函数,请查看Writing and Viewing Logs。如果可行,这将是 API。
【讨论】:
嘿,罗恩,听起来不错。我查看了 react-native-firebase 文档,但没有看到任何方法可以获取用户数量和使用 firebase 分析的会话。文档链接github.com/invertase/react-native-firebase-docs/blob/master/…以上是关于firebase 统计在线用户并在全球计数器中更新的主要内容,如果未能解决你的问题,请参考以下文章