Я хочу посчитать онлайн-пользователей в 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 })
})
}

У меня естьНекоторые проблемы с этими функциями иногда отрицательны, и я хочу предотвратить это.иногда я получаю в транзакции текущий ноль.
Как я могу это исправить?