在云函数中使用admin.database()。ref()。on(' child_added')是个好主意吗?

时间:2018-03-15 08:53:49

标签: firebase firebase-realtime-database google-cloud-functions

我在firebase云功能上创建一个通用队列来运行庞大的任务列表。我想知道我是否可以使用.on('child_added')将新任务推送到队列中。

我得到的问题是,我的队列在10分钟或有时15分钟后随机中断。

admin.database().ref('firebase/queues/').on('child_added', async snap => {
    let data = snap.val();
    console.log(data);
       try {
           await queueService.start(data);
       } catch (e) {
           console.log(e.message);
       }
   snap.ref.remove();
});

或者我会回去使用触发器吗?

functions.database.ref('firebase/queues/{queueId}').onCreate(event => {
    return firebaseQueueTrigger(event);
});

2 个答案:

答案 0 :(得分:0)

如果您只想从数据库中检索数据,则可以在云功能中使用child_added

onCreate()是一个数据库触发器,只要将新数据添加到数据库就会触发。

更多信息:

https://firebase.google.com/docs/functions/database-events

因此,当新数据添加到数据库时,将会触发提供的位置onCreate()。两者都可用于云功能

答案 1 :(得分:0)

问题不在于使用child_added,而是在云功能中保持活跃的on(...on(...方法会附加一个侦听器,在您调用off()之前,该侦听器会保持连接状态。这本质上与云函数的短暂性质相冲突,云函数意味着具有触发器 - 执行 - 退出流程。通常,如果您需要在Cloud Function中读取数据库中的其他数据,则需要使用once(....以便检测读取何时完成。

但在您的具体情况下:如果您要创建工作人员队列,那么我希望所有数据都已经使用event.data。您的functions.database.ref('firebase/queues/{queueId}').onCreate(event本质上是与firebase.database().ref('firebase/queues').on('child_added'等效的云函数。