You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Realtime Database异常,在线状态检测数据同步失败

问题根因及修复方案

核心问题1:未启用连接状态监听

你把官方示例里/.info/connected的监听逻辑完整注释了,这是导致所有异常的直接原因:

  • 你的set操作和onDisconnect配置都只在本地缓存执行,没有触发和服务端的同步,所以Firebase控制台看不到数据,回调也不会触发(回调需要等服务端确认后才会执行)
  • onDisconnect的操作必须在客户端和服务端建立有效连接的前提下配置才会生效,你跳过了连接状态校验直接配置,离线状态下的状态更新自然不会写入服务端

核心问题2:初始化配置可能存在偏差

你同时使用Firestore和RTDB,若你的RTDB实例不是项目默认的同区域实例,初始化时没有传入完整的数据库URL,会导致客户端默认连接到错误的实例,出现数据仅本地可见、服务端不显示的问题。


修复后的代码
import database from "@react-native-firebase/database";

export const updateUserLastSeen = (userId) => {
  // 非默认RTDB实例需要在这里传入完整的数据库URL,例:
  // const userStatusDatabaseRef = database('https://你的数据库实例链接.rtdb.区域.firebasedatabase.app').ref(`/lastSeen/${userId}`);
  const userStatusDatabaseRef = database().ref(`/lastSeen/${userId}`);
  console.log("updatelast", userId);

  // 恢复连接状态监听,只有连接成功后才执行状态更新和离线配置
  database()
    .ref(".info/connected")
    .on("value", (snapshot) => {
      if (snapshot.val() === false) return;

      // 连接成功后先配置离线操作
      userStatusDatabaseRef
        .onDisconnect()
        .set({
          state: false,
          time: database.ServerValue.TIMESTAMP,
        })
        .then(() => {
          console.log("disconnect configured");
          // 离线配置生效后再更新当前在线状态
          return userStatusDatabaseRef.set({
            state: true,
            time: database.ServerValue.TIMESTAMP,
          });
        })
        .then(() => console.log("online status synced to server"))
        .catch((e) => console.log("status update error:", e));
    });
};

export const checkUserLastSeen = (userId, setUserLastSeen) => {
  console.log("check last", userId);
  database()
    .ref(`/lastSeen/${userId}`)
    .on("value", (snapshot) => {
      // 空值处理:用户从未上线时返回默认状态
      const data = snapshot.val();
      setUserLastSeen(data ?? { state: false, time: null });
      console.log("User data: ", data);
    });
  console.log("after check last");
};

额外验证项
  • 确认你修改的是Realtime Database的读写规则,和Firestore的规则是独立配置的,规则示例如下:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
  • 测试前卸载原有应用重装,清除本地旧的未同步缓存数据,避免干扰测试结果

内容的提问来源于stack exchange,提问作者asd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:18:02