【问题标题】:Firestore returns a document even though none exists即使不存在,Firestore 也会返回一个文档
【发布时间】:2021-05-08 04:39:43
【问题描述】:

我使用的是 Web API、Typescript,没有使用其他库。
我已经建立了一个非常简单的数据库。用户使用电子邮件/密码进行注册,并将一个文档添加到 /users 集合中,并以他们的 uid 作为密钥。当用户登录时,我会根据 /users 集合检查他们的 uid 并返回相关文档。

我一直在搞乱安全规则,检查我的逻辑并定期通过 Firebase 控制台手动删除用户和数据。 我不知道是否有什么东西弄糊涂了,但是根据控制台数据选项卡,现在我的数据库完全是空的-没有/users 集合或其他任何东西-但是当我运行时...

this.db.doc(`users/${firebase.auth().currentUser.uid}`).get()

...我得到一个具有正确 ID(与我的注册用户 ID 匹配)的文档,但 exists 属性是 false。这是哪里来的?

由于数据库是空的,我假设它来自某种本地缓存?
或者我是否因手动删除数据而混淆或不同步?
我可以清除那个缓存,还是我必须对exists:false做额外检查

祝大家好运

【问题讨论】:

    标签: typescript firebase google-cloud-firestore


    【解决方案1】:

    我得到了一个具有正确 id 的文档(与我的注册用户 id 匹配),但 exists 属性为 false。这是哪里来的?

    您将始终获得任何单个文档 get() 的 DocumentSnapshot。这就是它的工作方式。您必须检查存在标志(或查看data() 返回一个对象)以了解该快照中是否有任何数据。实际上并没有比这更复杂。

    【讨论】:

    • @shn:我理解这个问题的方式与 Doug 在这里所做的相同。 DocumentReferenceget() 调用始终返回 DocumentSnapshot 对象,即使数据库(或缓存)中不存在文档也是如此。 如果确实不存在这样的文档,则DocumentSnapshotexists 属性为`false。
    • 啊,好吧,所以 id 与请求匹配的事实只是因为它是基于该请求返回的,而不是因为它具有某种旧实例的缓存版本。这是有道理的(我认为),甚至可以解释我看到的另一种奇怪的行为。我现在在做别的事情,但今晚会在我的构建中检查这个。
    • DocumentSnapshot 中的 ID 始终与您在 DocumentReference 中使用的完全相同。请注意,在您事先不知道 ID 的查询结果中也会使用 DocumentSnapshot。在这种情况下,ID 是更有用的信息。
    • 是的,现在一切都开始变得有意义了。有点:)为答案干杯。我相信我很快就会回来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2019-10-13
    • 2019-08-08
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多