【问题标题】:Firestore .get() promise stuck on pendingFirestore .get() 承诺停留在待处理状态
【发布时间】:2020-05-22 03:24:18
【问题描述】:

我正在使用 React 和 Firebase 创建一个小应用程序。我正在尝试检查与我的 firestore 数据库中的用户相关的文档,其中文档 ID 与 firebase auth 生成的 uid 相同,但由于某些原因,.get() 承诺保持未决状态,导致 .exists( ) 函数引发错误(TypeError: userDoc.exists 不是函数)。我最初认为这是我的数据库规则有问题,所以我更改了它们,以便任何人都可以读取和写入数据库(我知道不安全,规则稍后会更改)。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

即使在此之后,我仍然无法检索文档。下面是我的代码。

let userDoc = db.collection('Users').doc(currentUser.uid)
console.log(userDoc);
userDoc = userDoc.get();
console.log(userDoc);
userDoc = userDoc.exists();

db 是使用创建的 Firestore 对象

admin.initializeApp()
db = admin.firestore()

let userDoc = db.collection('Users').doc(currentUser.uid) 产生一个 DocumentReference 对象。该文档存在于 Firestore 中,但由于某种原因,我无法在我的 react 应用程序中访问它。我已经编写了一个云函数,也可以与 firestore 一起使用,并且它在读取和写入我的数据库时没有问题。我觉得我在这里遗漏了一些东西,非常感谢任何帮助。

【问题讨论】:

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

userDoc.get();promise,它通过.get() 发出请求,因此它将处于挂起状态。

并将exists() 更改为existsREF

userDoc.get().then(data => {
   console.log(data , data.exists); //<--- Try to check here
});

console.log(userDoc); // <--- this will give you Promise with pending state

或者你可以使用async await

async function getData() { // <------ async
    let userDoc = db.collection('Users').doc(currentUser.uid)
    console.log(userDoc);
    userDoc = await userDoc.get(); // <------ await
    console.log(userDoc);
    userDoc = userDoc.exists; // <------ exists not exists();
}

【讨论】:

  • 我试过了,等待 userDoc.get();返回了一个 DocumentSnapshot,但是 React 仍然说 exists() 方法没有定义。我现在的解决方法是使用 return userDoc != null && (typeof userDoc === "undefined");但是你知道为什么 exists() 方法在文档快照上不起作用吗?
  • @NakulUpadhya,应该是 userDoc.exists 而不是 userDoc.exists()
【解决方案2】:

userDoc = userDoc.get();

在这一行中userDoc.get() 返回一个承诺并分配给userDoc。当该承诺得到解决时 - 您将收到一个 DocumentSnapshot ,然后将具有 exists 属性。

userDoc.get()
.then(doc=> {
    if(doc.exists) console.log(doc.data());
})

您可以查看文档中的examples,了解如何使用 javascript sdks 读取数据。

【讨论】:

  • 我试过了,即使这样我也得到了一个错误,即 exists() 方法不是函数,即使我得到了一个文档快照对象。
  • 抱歉有错字 - 存在 property 无效,相应更新代码。
猜你喜欢
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
相关资源
最近更新 更多