如何收听 firebase 云功能中的实时数据库更改(如流)?

How to listen to realtime database changes (like a stream) in firebase cloud functions?

我正在尝试监听 Firebase 实时数据库中特定文档中特定字段的变化。我将 Node JS 用于云功能。这是函数。

const functions = require("firebase-functions");
const admin = require('firebase-admin');
admin.initializeApp(functions.config.firebase);


const delay = ms => new Promise(res => setTimeout(res, ms));

exports.condOnUpdate = functions.database.ref('data/').onWrite(async snapshot=> {

    const snapBefore = snapshot.before;
    const snapAfter = snapshot.after;
    const dataB = snapBefore.val();
    const data = snapAfter.val();
    const prev= dataB['cond'];
    const curr= data['cond'];

    // terminate if there is no change
    if(prev==curr)
    {
        return;
    }


    if(curr==0){
        // send notifications every 10 seconds until value becomes 1
         while(true){
            admin.messaging().sendToTopic("all", payload);
            await delay(10000);
        }
    }else if(curr==1){
        // send one notification
        admin.messaging().sendToTopic("all", payload);
        return;
    }

});

该函数按预期工作,但循环永远不会停止,因为它从不存在循环,相反,该函数再次运行(我想是使用新实例)。

那么有没有什么方法可以像其他语言的流一样监听一个函数中的数据变化,或者可能停止来自 运行.

的所有云函数

提前致谢!

从评论看来,cond 属性 是从 Cloud Function 外部更新的。发生这种情况时,它将使用自己的 curr 变量将 Cloud Function 的新实例触发为 运行,但不会导致更新当前实例中的 curr 值.所以你代码的原始实例中的curr变量永远不会变为true,它会一直运行直到超时。


如果您希望当前实例检测到对 属性 的更改,您还需要在代码中通过调用 onValue 对其的引用来监视 属性 .

一种更简单的方法可能是使用 interval trigger 而不是数据库触发器来:

  • 让代码每分钟执行一次,然后在那里
  • 用相关的cond值查询数据库,然后
  • 向每个人发送通知。

这不需要在您的代码中出现无限循环或超时,这对于 Cloud Functions 通常是一种更好的方法。