Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 让Node.JS服务器实时更新FireBase数据库的最佳方法?_Javascript_Node.js_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 让Node.JS服务器实时更新FireBase数据库的最佳方法?

Javascript 让Node.JS服务器实时更新FireBase数据库的最佳方法?,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我目前设置了一个Node.JS服务器,当用户发出请求时,它能够从FireBase数据库读取和写入数据 我希望实现基于时间的事件,这些事件会导致在特定日期或时间执行操作。但这里的关键是,我想在几秒钟内自由地完成这项工作(例如,在30秒过后,或者在13日星期五上午11:30,向控制台发送消息) 一种方法是在数据库中存储需要执行操作的日期/时间,并每秒从数据库中读取数据,将当前日期/时间与存储的事件进行比较,以便我们知道此时是否需要执行操作。但是,正如您可以想象的那样,这将是对数据库的大量不必要的调用

我目前设置了一个Node.JS服务器,当用户发出请求时,它能够从FireBase数据库读取和写入数据

我希望实现基于时间的事件,这些事件会导致在特定日期或时间执行操作。但这里的关键是,我想在几秒钟内自由地完成这项工作(例如,在30秒过后,或者在13日星期五上午11:30,向控制台发送消息)

一种方法是在数据库中存储需要执行操作的日期/时间,并每秒从数据库中读取数据,将当前日期/时间与存储的事件进行比较,以便我们知道此时是否需要执行操作。但是,正如您可以想象的那样,这将是对数据库的大量不必要的调用,并且感觉这是实现该系统的一种糟糕的方式

有没有一种方法可以让我不必每秒都打电话就可以与数据库保持同步?也许我可以在本地存储events表的一个版本,并在数据库发生更改时更新它?那会是个更好的主意吗?我还缺少另一个解决方案吗

如有任何建议,将不胜感激,谢谢

编辑: 当前初始化数据库的方式:

firebase.initializeApp(firebaseConfig);
var database = firebase.database();
await database.ref('/').once('value', function(snapshot){
        snapshot.forEach(function(childSnapshot){
            if(childSnapshot.key === userName){
                userPreferences = childSnapshot.val().UserPreferences;
            }

        })
    });

然后如何从数据库中获取数据:

firebase.initializeApp(firebaseConfig);
var database = firebase.database();
await database.ref('/').once('value', function(snapshot){
        snapshot.forEach(function(childSnapshot){
            if(childSnapshot.key === userName){
                userPreferences = childSnapshot.val().UserPreferences;
            }

        })
    });


听起来你想开发一个用于调度的应用程序。如果是这样的话,你应该退房

节点调度是一个灵活的类cron而非类cron的作业调度程序 对于Node.js。它允许您为任务计划作业(任意函数) 在特定日期执行,具有可选的重复规则。只是 在任何给定时间使用单个计时器(而不是重新评估 即将到来的作业(每秒钟/分钟一次)

然后,您可以使用数据库来保持应用程序的“状态”,这样在启动应用程序时,您将读取预期的所有即将到来的作业,并将它们加载到
节点计划
,然后让
节点计划
执行其余操作。

Firebase
once()
API从数据库读取数据一次,然后停止观察它


如果您使用
on()
API,它将在获得初始值后继续观察数据库,并在数据库发生变化时调用您的代码。

谷歌云解决方案用于安排未来工作的单个项目是云任务。Firebase是谷歌云的一部分,所以这是最自然的产品。您可以使用它来避免轮询数据库,只需精确地指定某个云函数应该在何时运行以完成您想要的工作


我已经编写了一个演示如何设置云任务以调用云函数来删除Firestore中具有确切TTL的文档的程序。

Firebase有两个数据库:实时数据库和Cloud Firestore,但不清楚您使用的是哪一个数据库。幸运的是,两者都支持实时侦听器,这似乎是您所需要的关键。但我很难理解你的处境。你能编辑你的问题来显示更多的代码和数据吗?让我“卡住”的部分更多的是关于这个项目的计划方面。我正在使用一个实时数据库,并在问题中添加了相关代码。我是不是误解了这是怎么回事?当我执行firebase.database()时,是否已经实时更新了它?这意味着我可以在不太苛刻的情况下每秒获取数据库快照?这听起来非常有用!谢谢,我来看看!