Firebase 实时数据库 获取数据时出错,客户端离线

Posted

技术标签:

【中文标题】Firebase 实时数据库 获取数据时出错,客户端离线【英文标题】:Firebase realtime database Error getting data, Client is offline 【发布时间】:2021-12-10 08:22:04 【问题描述】:

我正在尝试使用以下代码从实时数据库中检索数据。我想在 textview 中显示这些数据,但不幸的是它没有在 logcat 中显示我收到如下所示的错误消息。我认为代码没问题,但它可能与 firebase 或与 firebase 相关的东西有问题。请帮忙!

private fun getStudentData()
    database = FirebaseDatabase.getInstance().getReference("users")
    database.child(uid).get().addOnSuccessListener 
        val studentName = it.child("name").value
        val studentBio = it.child("bio").value

        binding.tvStudentName.text = studentName.toString()
        binding.tvStudentBio.text = studentBio.toString()
    .addOnFailureListener
        Log.e("firebase", "Error getting data", it)
    

2021-10-24 21:59:22.498 30028-30028/com.example.amazontutoringcenter E/firebase: Error getting data
    java.lang.Exception: Client is offline
        at com.google.firebase.database.connection.PersistentConnectionImpl.lambda$get$1$PersistentConnectionImpl(PersistentConnectionImpl.java:441)
        at com.google.firebase.database.connection.PersistentConnectionImpl$$ExternalSyntheticLambda4.run(Unknown Source:8)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:929)

【问题讨论】:

你希望代码做什么?为什么你认为你得到的结果不正确? 你检查你的权限规则了吗?是否允许您的应用读取该集合? @FrankvanPuffelen 我试图在 textview 中显示来自 firebase 实时数据库的用户的一些信息,但它没有显示任何内容,并且 logcat 显示了该错误。 @KathanPatel 你指的是我们允许用户读写数据的firebase规则吗?我已经做到了。 是的,我指的是同一个。你检查过它在 addOnFailureListener 中抛出了什么异常吗? 【参考方案1】:

我在使用 React Native/Expo(v42.0.1)、Firebase(v9.4.0) 和 Realtime DB 时遇到了这个错误。该代码可以在 android 虚拟机上完美运行...

const queryRef = query(ref(database, "..."));
get(queryRef)
  .then((snapshot) => 
    if (snapshot.exists()) ... 
    else ...
  )
  .catch((err) => ...);

但在物理 Android 设备上会因此错误而失败...

Error: Client is offline.
at node_modules\@firebase\database\dist\exp\index.esm2017.js:11172:22 in repo.server_.get.then$argument_1
at node_modules\react-native\node_modules\promise\setimmediate\core.js:37:13 in tryCallOne
at node_modules\react-native\node_modules\promise\setimmediate\core.js:123:24 in setImmediate$argument_0
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:130:14 in _callTimer
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:181:14 in _callImmediatesPass
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:441:30 in callImmediates
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:387:6 in __callImmediates
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135:6 in __guard$argument_0
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:364:10 in __guard
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:134:4 in flushedQueue

如果我在最初失败后再次调用 get(),它会起作用! 所以我回去阅读了 firebase 文档。我最终登陆了Enable Offline Capabilities - Kotlin 页面。在Detecting Connection State - Kotlin 上有一个部分。在成功的 if 语句中包装我的代码后,我的问题就解决了!

val connectedRef = Firebase.database.getReference(".info/connected")
connectedRef.addValueEventListener(object : ValueEventListener 
    override fun onDataChange(snapshot: DataSnapshot) 
        val connected = snapshot.getValue(Boolean::class.java) ?: false
        if (connected) 
            Log.d(TAG, "connected")

            //DB is ready for get() call 

         else 
            Log.d(TAG, "not connected")
        
    

    override fun onCancelled(error: DatabaseError) 
        Log.w(TAG, "Listener was cancelled")
    
)

注意:我注意到在使用这种方法时,“未连接”总是在“已连接”之前调用。这让错误处理变得有趣。

【讨论】:

【参考方案2】:

这对我不起作用,因为我在获取数据库实例时没有指定服务器 URL。 除了这个错误,我在控制台中得到了这个:

Firebase 数据库连接被服务器强行终止。将要 不要尝试重新连接。原因:数据库位于不同的区域。 请将您的数据库 URL 更改为 /my database url here/

为了修复它,我只是指定了这样的服务器:

 FirebaseDatabase.getInstance("YOUR_URL_HERE")

可以在您的 Firebase 控制台中找到参数“YOUR_URL_HERE”。例如:

screenshot

【讨论】:

以上是关于Firebase 实时数据库 获取数据时出错,客户端离线的主要内容,如果未能解决你的问题,请参考以下文章

第一次调用时捕获 Firebase 实时observeSingleEvent 数据失败

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

Firebase 实时数据库获取函数返回未定义(较新的 firebase 版本,2021) - 使用 React Native

React Native 和 Firebase 实时数据库

如何获取对Firebase实时数据库的引用

使用Node,EJS和Firebase进行实时数据库模板化