Firestore 查询侦听器可以“侦听”云功能吗?

Posted

技术标签:

【中文标题】Firestore 查询侦听器可以“侦听”云功能吗?【英文标题】:Can a Firestore query listener "listen" to a cloud function? 【发布时间】:2021-08-07 07:06:20 【问题描述】:

当用户打开应用时,如果 auth.currentuser 不为空,那么我需要查询用户的用户名。我认为查询侦听器是有意义的,因为我不想在每次某些代码要求用户名时一直 ping 服务器。我查看了他们提供的 Firebase 文档:

val docRef = db.collection("cities").document("SF")
docRef.addSnapshotListener  snapshot, e ->
    if (e != null) 
        Log.w(TAG, "Listen failed.", e)
        return@addSnapshotListener
    

    val source = if (snapshot != null && snapshot.metadata.hasPendingWrites())
        "Local"
    else
        "Server"

    if (snapshot != null && snapshot.exists()) 
        Log.d(TAG, "$source data: $snapshot.data")
     else 
        Log.d(TAG, "$source data: null")
    

但是,我被建议尝试使用尽可能少的客户端代码来优化安全性,因此上述示例让我担心。是否可以使用查询侦听器来侦听可以输出用户名的服务器端函数,这样我仍然可以只运行一次查询,即将用户名保存到客户端缓存?

【问题讨论】:

您应该使用 Firestore 规则来限制访问并保护您的数据。 您可以使用 get() 调用并仅获取一次数据。这样,您就不会实时监听变化。这不是你想要的吗? @AlexMamo get() 会自动将其保存到缓存中吗?我不打算允许用户更改他们的用户名,所以他们只需要在整个帐户存在时查询一次。试图在文档 atm 中找到这个 get()... 对于 android,Cloud Firestore 默认启用离线持久性。这意味着,当用户离线时,用户名的值将从缓存中读取。但是,这并不意味着在线,不会再被阅读。我认为这篇 How to drastically reduce the number of reads when no documents are changed in Firestore? 的文章可能会让您感兴趣。 嘿@whatwhatwhat。你在这方面有什么进展吗?我试图在下面提供答案。你看见了吗?有意义吗? 【参考方案1】:

Cloud Functions 是短暂的,您需要为它们的激活时间付费。您无法长时间保持来自 Cloud Function 的连接打开,例如 Firestore 服务器和 SDK 使用的快照侦听器。

虽然完全可以在 Cloud Functions 中封装对 Firestore 的访问,但这将遵循更传统的请求/响应模型。

我建议退房:

Doug 的博文:Patterns for security with Firebase: offload client work to Cloud Functions。 Doug 的博文:Patterns for security with Firebase: combine rules with Cloud Functions for more flexibility

【讨论】:

以上是关于Firestore 查询侦听器可以“侦听”云功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:如果两个侦听器监听相同的查询 firebase 维护两个不同的查询快照?

有时我的云函数会从 Firestore 返回旧数据。是缓存问题吗?

如何从 Vuex 商店中删除 Firestore 快照侦听器

创建侦听器时调用 Firestore“ListenerRegistration”,应该是?

为啥添加单个文档时,Firestore 侦听器会返回 .add 两次?

是否应该避免同时添加多个 Firestore 快照侦听器?