База данных Firebase в реальном времени показывает странное поведение

# #javascript #firebase-realtime-database #react-native-firebase

Вопрос:

Я использую react-native-firebase в удаленном приложении expo и пытаюсь создать систему обнаружения присутствия в своем приложении для чата, которая определит, находится ли получатель сообщения в Сети, и если нет, то когда он/она в последний раз был в Сети. Данные будут храниться следующим образом в базе данных firebase в реальном времени:

 {
 lastSeen:[{
   [userId]:{
    state: boolean
    time: serverTimeStamp
   }
 }]
}
 

Проблема в том, что консоль firebase никогда не показывает данные, и только если получатель находится в Сети, приложение показывает эти данные (даже если они не видны в консоли), но если пользователь находится в автономном режиме, то ничего не возвращается и не генерируется ошибка. Я установил для чтения и записи значение true в правилах realtimeDB. Вот код, который я использую:

 import database from "@react-native-firebase/database";

export const updateUserLastSeen = (userId) => {
  const userStatusDatabaseRef = database().ref("/lastSeen/"   userId);
  console.log("updatelast", userId);
  userStatusDatabaseRef
    .set({
      state: true,
      time: database.ServerValue.TIMESTAMP,
    })
    .then(() => console.log("online"))
    .catch((e) => console.log(e));
  // database()
  //   .ref(".info/connected")
  //   .on("value", function (snapshot) {
  //     if (snapshot.val() == false) {
  //       return;
  //     }

  userStatusDatabaseRef
    .onDisconnect()
    .set({
      state: false,
      time: database.ServerValue.TIMESTAMP,
    })
    .then(function () {
      console.log("disconnect configured");
      // userStatusDatabaseRef.set({
      //   state: true,
      //   time: database.ServerValue.TIMESTAMP,
      // });
    });
  // });
};

export const checkUserLastSeen = (userId, setUserLastSeen) => {
  console.log("check last", userId);
  database()
    .ref("/lastSeen/"   userId)
    .on("value", (snapshot) => {
      setUserLastSeen(snapshot.val());
      console.log("User data: ", snapshot.val());
    });
  console.log("after check last");
};
 

Я попробовал как код из документов firebase, так и документы rnfirebase. В приведенном выше коде ни одна из функций «затем» или «поймать» не вызывается в updateUserLastSeen, но в checkUserLastSeen «включено» вызывается только в том случае, если носитель идентификатора пользователя находится в сети. Кроме того, я использую базу данных в реальном времени только для этой цели, а cloud firestore-для хранения других данных, и он работает нормально.
Любая помощь будет признательна. Спасибо.

Комментарии:

1. Если then не вызывается ни или catch записи, это обычно означает, что клиент не подключен к серверу. Вы уверены, что у вас есть сетевое подключение? И что вы настроили (правильный) URL-адрес для своей базы данных?

2. @FrankvanPuffelen забыл обновить файл служб Google, глупый я. Хотя чего я не понимаю, так это почему он смог получить результат ранее, когда носитель идентификатора пользователя был в Сети. В любом случае спасибо за помощь, очень признателен.

3. Приятно слышать. Я написал это в ответе, так как мы действительно иногда видим это там, где люди не понимают пути устранения неполадок.

Ответ №1:

Если then не вызывается ни или catch записи, это обычно означает, что клиент не подключен к серверу.

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