Как обрабатывать несколько вкладок в Firebase, используя базу данных в реальном времени - PullRequest
0 голосов
/ 18 января 2020

Я создаю многопользовательский игровой сайт. Я использую три функции 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(). Пожалуйста, наведите меня на правильный путь.

1 Ответ

2 голосов
/ 18 января 2020

Если я правильно понимаю, вы пытаетесь отслеживать онлайн-статус пользователя, используя обработчики Firebase onDisconnect. Для этого:

Вы записываете значение для UID пользователя при подключении. Затем вы удаляете это значение с помощью обработчика onDisconnect.

Это действительно не будет работать, когда пользователь открывает приложение в нескольких местах (вкладки, браузеры или устройства). Причина в том, что пользователь может находиться в сети в нескольких местах, и ваш код и структура данных должны учитывать это.

Подход idiomati c - это тот, который описан в приложении для демонстрации наличия в документации Firebase и работает со структурой данных, подобной этой:

"OnlineUsers": {
  "uidOfUser1": {
    "-LKeyOfConnection1": true,
    "-LKeyOfConnection2": true
  },
  "uidOfUser2": {
    "-LKeyOfConnection3": true,
    "-LKeyOfConnection4": true
  }
}

В этой структуре, если у пользователя есть два открытых соединения (на разных вкладках, в браузерах, на устройствах), у него есть два узла под своим UID, каждый со своим обработчиком onDisconnect. Когда оба соединения закрыты, ключи соединения исчезают, и, таким образом, их узел /OnlineUsers/$uid также автоматически исчезает.

Таким образом, чтобы определить, находится ли пользователь в сети в вышеуказанной структуре, вы должны проверить, есть ли узел под /OnlineUsers с его UID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...