将 Firestore 中的数据分配给变量

IT技术 javascript reactjs google-cloud-firestore
2021-05-23 06:27:40

我试图使用 get doc 函数从 firestore 数据库中将变量分配给它们受尊重的值,我注意到它并没有分配或更新值。

我尝试使用异步和等待,但似乎无法使其工作。

getFromDatabase(nameOfCollection,nameOfDocument){

    const db = firebase.firestore();
    var docRef = db.collection(nameOfCollection).doc(nameOfDocument);
    docRef.get().then(function(doc) {
        if (doc.exists) {

         outvariable = doc.data().anyfield; // THIS IS WHAT I WANT
         console.log(" Document data:", doc.data());
        } else {
            console.log("No such document!");
        }
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });

  }

我期待 outvariable = doc.data().anyfield

2个回答

您很可能对从 Firestore 异步加载数据这一事实感到困惑。并不是说数据没有分配给值,因为它确实如此。它只是发生在与您预期不同的时间。

通过在加载数据的代码周围添加一些简单的日志语句,最容易看到这一点:

const db = firebase.firestore();
var docRef = db.collection(nameOfCollection).doc(nameOfDocument);
console.log("Before starting to load data");
docRef.get().then(function(doc) {
  console.log("Got data";
});
console.log("After starting to load data");

运行此代码时,输​​出为:

在开始加载数据之前

开始加载数据后

得到数据

这可能不是您所期望的,但实际上是完全正确的。数据从 Firestore 异步加载(因为它可能需要一些时间),而不是等待,主代码继续。然后,当数据可用时,将使用该数据调用您的回调函数。

这意味着任何需要数据库数据的代码都必须回调中,或者从那里调用。所以console.log(" Document data:", doc.data())在你的原始代码中应该可以正常工作。但是类似的console.log 外部回调将不起作用,因为它在数据可用之前运行。

对于不熟悉此类 API 的开发人员来说,这是一个非常常见的混淆来源。但由于大多数现代 Web/云 API 和许多其他 API 都是异步的,因此最好快速学习如何使用它们。为此,我建议阅读:

可以使用 .data() 或 .get() 提取数据以获取特定字段。

例如: doc.get(anyfield);

更多信息可以在官方文档中找到