首页 > 解决方案 > 在全局范围内访问 Firestore 数据

问题描述

我正在尝试访问 firestore 数据并将其推送到数组中。这是超级基本的,但由于某种原因,我无法弄清楚为什么这不起作用:

var db = admin.firestore();

let arr = [];

var Ref = db.collection('Test').doc('Document');
var getDoc = Ref.get()
    .then(doc => {
       if (!doc.exists) {
         console.log('No such document!');
       } else {
          let data = doc.data().Name;
          arr.push(data);
       }
    })
    .catch(err => {
         console.log('Error getting document', err);
    });

 console.log(arr)  // expecting >>> ['Joe'] (ie: data that is in firestore object)

为什么不arr包含 firestore 对象?

谢谢您的帮助。

标签: node.jsgoogle-cloud-firestore

解决方案


它还不包含来自 firestore 的数据

通过get()返回一个 Promise 然后继续程序执行来异步操作。下一行是console.log(arr),但arr尚未填充 - 它在 Promise 完成时填充(调用then()部件)。

如果您使用的是足够现代的节点版本(节点 8 及更高版本,此时您应该使用它),那么您可以使用await等待异步操作完成,然后再继续下一行。

我还没有测试过,但你的代码在重写后可能看起来像这样:

doc = await Ref.get();
if (!doc.exists) {
  console.log('No such document!');
} else {
   let data = doc.data().Name;
   arr.push(data);
}

console.log(arr)

这将起作用,因为await等待异步get()完成并返回文档。其余部分同步处理。


推荐阅读