Я создаю многопользовательский игровой сайт. Я использую три функции FireBase.
- Аутентификация Firebase
- Firestore
- База данных реального времени
Данные, которые являются постоянными, хранятся в пожарном хранилище. Как изображение профиля, имя пользователя et c. Данные в firestore хранятся в коллекции users
, и ключ совпадает с идентификатором аутентификации, который мы получаем из user.uid
Вторые данные - это временные данные, которые содержат сообщения чата и текущую игровую ситуацию и игрока. Turn et c. Эти данные хранятся в базе данных в реальном времени.
В базе данных реального времени есть два базовых объекта. Один - rooms
, а другой - users
. Когда пользователь входит на веб-сайт, постоянные данные берутся из пожарного депо и помещаются с временными данными (потому что нам может понадобиться снова и снова отображать постоянные данные). Я использую функцию для получения постоянных данных и создания комбинации с временными данными:
// 'uid' - это постоянный id
, который используется в firestore
, а также при аутентификации.
export const addUser = async (uid: string) => {
//gets the permanent data from firestore
const data = await getUserData(uid);
//Set it to realtime database my adding one more temp prop
return await dbUsers.child(uid).set({...data, messages: []});
};
До сих пор все нормально, проблема возникает, когда мне нужно отключить пользователя при отключении. Я использовал t
export const removeUser = async (uid: string) => {
return await dbUsers.child(uid).remove();
};
Приведенный выше способ не работает для нескольких вкладок. Представьте, что если пользователь открыл несколько вкладок и просто закрыл один сервер, то база данных в реальном времени сочтет, что он вышел из системы.
Нужно ли создавать данные в реальном времени на основе другого идентификатора, используя метод push()
. Пожалуйста, наведите меня на правильный путь.