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() 调用并仅获取一次数据。这样,您就不会实时监听变化。这不是你想要的吗? @AlexMamoget()
会自动将其保存到缓存中吗?我不打算允许用户更改他们的用户名,所以他们只需要在整个帐户存在时查询一次。试图在文档 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”,应该是?