如何将数据从Firestore查询加载到全局范围的变量中以供以后使用

时间:2019-08-30 22:23:01

标签: node.js google-cloud-firestore google-cloud-functions

就像我的问题标题所说,我想将firestore查询结果加载到我全局范围内的变量中,以供以后使用。

我想稍后在动态侦听器中使用该值,而不必一次又一次地重新查询它。

我尝试在Google上寻找简单的解决方案。我已经尝试使用promise,回调和await等待实现自己的解决方案,但无济于事。

这是来自github文档,该文档显示了如何执行我想要的操作,但没有查询。

https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/functions/tips/index.js


const heavyComputation = () => {
  // Multiplication is more computationally expensive than addition
  const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  return numbers.reduce((t, x) => t * x);
};

const functionSpecificComputation = heavyComputation;
const fileWideComputation = lightComputation;

// [START functions_tips_scopes]
// [START run_tips_global_scope]
// Global (instance-wide) scope
// This computation runs at instance cold-start
const instanceVar = heavyComputation();

这是我自己的尝试


const getNBAScoreKey = () => {


        return new Promise(resolve => {
            scoresRef.onSnapshot(nbaScoreKeySnapshot => {
                console.log("the value inside the score key: " + nbaScoreKeySnapshot.data()["FantScores"]);

                resolve(nbaScoreKeySnapshot.data());
            });

        });

    }

我希望变量是带有数据的对象,但是无论我尝试执行哪种实现,我都会得到“未定义”。

1 个答案:

答案 0 :(得分:1)

您可以在全局范围内设置变量,然后在scoresRef.onSnapshot中重新分配它的值,但是如果您尝试立即访问该值而不等待从数据库中获取数据,那么您当然会不确定,因为未获取数据

因此,在您的情况下,您必须使用可观察的设计模式,例如使用rxjs之类的lib或自己实现它,

Observable可让您定义变量并订阅值更改事件。

简单的观察者实现

let observer = {

    value: {} ,
    subscribers: [] ,
    subscribe: function (cb ) { this.subscribers.push(cb)} , 
    notify: function (data) { this.value = data ; this.subscribers.forEach( s => s(data);}

} 

要订阅值更改,您必须调用observer.subscribe并传递要在数据更改时触发的回调函数

observer.subscribe((data)=> { console.log('first', data ) } ) // first subscriber
observer.subscribe((data)=> { console.log('sec', data ) } ) // sec subscriber

//通知订户值已更改

observer.notify(123) 

输出将为

first 123123
sec 123123

您的案子,您必须首先在该观察员的任何地方订阅

observer.subscribe((data)=> { 
  console.log('I got some data from firestore', data );

  // Do some stuff
} );

,然后在获取函数中添加通知

const getNBAScoreKey = () => {


        return new Promise(resolve => {
            scoresRef.onSnapshot(nbaScoreKeySnapshot => {
                console.log("the value inside the score key: " + nbaScoreKeySnapshot.data()["FantScores"]);
                let data = nbaScoreKeySnapshot.data();
                observer.notify(data);
                resolve(data);
            });

        });

    }

您还可以随时通过调用observer.data来获取数据

确保已在全局范围内或在单独的文件上定义了观察者,并导出了观察者变量,然后将该文件导入到将共享数据的任何地方