【发布时间】:2018-09-28 22:07:32
【问题描述】:
我使用 firebase 和 firestore 构建 react 原生应用。 我要做的是,当用户打开应用程序时,将他的状态插入/更新为“在线”(一种存在系统),当用户关闭应用程序时,他的状态为“离线”。 我用 firebase.database.onDisconnect() 做的,效果很好。 这是函数
async signupAnonymous() {
const user = await firebase.auth().signInAnonymouslyAndRetrieveData();
this.uid = firebase.auth().currentUser.uid
this.userStatusDatabaseRef = firebase.database().ref(`UserStatus/${this.uid}`);
this.userStatusFirestoreRef = firebase.firestore().doc(`UserStatus/${this.uid}`);
firebase.database().ref('.info/connected').on('value', async connected => {
if (connected.val() === false) {
// this.userStatusFirestoreRef.set({ state: 'offline', last_changed: firebase.firestore.FieldValue.serverTimestamp()},{merge:true});
return;
}
await firebase.database().ref(`UserStatus/${this.uid}`).onDisconnect().set({ state: 'offline', last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
this.userStatusDatabaseRef.set({ state: 'online', last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
// this.userStatusFirestoreRef.set({ state: 'online',last_changed: firebase.firestore.FieldValue.serverTimestamp() },{merge:true});
});
}
之后,我确实触发了将数据插入到 firestore(因为我想使用 firestore),这就是功能(工作正常,但需要 3-4 秒)
module.exports.onUserStatusChanged = functions.database
.ref('/UserStatus/{uid}').onUpdate((change,context) => {
const eventStatus = change.after.val();
const userStatusFirestoreRef = firestore.doc(`UserStatus/${context.params.uid}`);
return change.after.ref.once("value").then((statusSnapshot) => {
return statusSnapshot.val();
}).then((status) => {
console.log(status, eventStatus);
if (status.last_changed > eventStatus.last_changed) return status;
eventStatus.last_changed = new Date(eventStatus.last_changed);
//return userStatusFirestoreRef.set(eventStatus);
return userStatusFirestoreRef.set(eventStatus,{merge:true});
});
});
然后,我想计算应用程序中的在线用户,所以我在将新数据写入firestore节点时确实触发了它通过查询计算在线用户的大小。(它工作正常但需要4-7秒)
module.exports.countOnlineUsers = functions.firestore.document('/UserStatus/{uid}').onWrite((change,context) => {
console.log('userStatus')
const userOnlineCounterRef = firestore.doc('Counters/onlineUsersCounter');
const docRef = firestore.collection('UserStatus').where('state','==','online').get().then(e=>{
let count = e.size;
console.log('count',count)
return userOnlineCounterRef.update({count})
})
return Promise.resolve({success:'added'})
})
然后进入我的反应原生应用程序 我得到在线用户数
this.unsubscribe = firebase.firestore().doc(`Counters/onlineUsersCounter`).onSnapshot(doc=>{
console.log('count',doc.data().count)
})
所有操作大约需要 12 秒。这对我来说太多了,它是在线应用程序
我的火力基地结构 我做错了什么?可能有什么不必要的功能什么的?
我的最终目标:
- 尽量减少操作时间。
- 获取在线用户数(使用 listener-each 更改,它将在应用程序中更新)
- 更新用户状态。
如果有其他方法可以做到这一点,我很想知道。
【问题讨论】:
标签: firebase firebase-realtime-database google-cloud-firestore