首页 > 解决方案 > 仅当来自实时数据库的值等于 X 时,如何执行 Firebase 计划功能?

问题描述

我开始在 Android Studio 的 adnroid 应用程序中使用 Firebase 云功能进行冒险,但我没有这方面的经验。更重要的是,我以前从未使用过 javascript,所以一切对我来说似乎都是新的。我想知道我是否可以制作一个像这样工作的预定功能:

  1. 首先,函数检查来自实时数据库的值是否不为零。
  2. 如果不是,则函数检查来自实时数据库的另一个值是否不大于 7。
  3. 如果不是,则数据库中的值增加 1。
  4. 然后发送通知。

我创建了测试功能来检查数据库中的数据是否被正确获取,但它执行时出现错误“未定义 Firebase”。

exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun((context) => {
var user = user.uid;
var myRef = firebase.database().ref(user + "/CurrentChallenge/numOfActiveChallenge");
myRef.on('value', (snapshot) => {
  const data = snapshot.val();
  console.log(data);
});

标签: androidfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


在 Cloud Function 中,如果您想与 Firebase 服务交互,您需要使用Admin SDK

此外,如果您想在 Cloud Function 中读取数据库节点,则更适合读取一次节点(使用get()once())而不是使用 设置侦听器on()。事实上,CF 的寿命很短,因此设置监听器不是正确的方法。

目前尚不清楚如何获得user变量的值。计划的云功能中没有用户。你需要调整这条线,因为这样它就行不通了。

最后,需要注意的是,当所有异步工作完成后,您需要终止 Cloud Function,请参阅文档。对于后台触发的云函数(例如,Pub/Sub 调度云函数),您必须返回由异步方法调用返回的整个承诺链。另一种可能性是使用 async/await,如下所示,并null在所有异步工作完成后返回一个值(例如 )。

因此,以下代码框架应该可以解决问题:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access Firestore.
const admin = require('firebase-admin');
admin.initializeApp();


exports.scheduledFunction = functions.pubsub.schedule('every 5 minutes').onRun(async (context) => {

    var user = ... // Set the value of user

    const db = admin.database();  // Admin SDK

    const snapshot1 = await db.database().ref("...").get();

    if (snapshot1.val() !== 0) {
        const snapshot2 = await db.database().ref("...").get();

        if (snapshot2.val() <= 7) {

            await db.ref("...").update({
                fieldName: firebase.database.ServerValue.increment(1)
            });

            //send the notification
            // See https://github.com/firebase/functions-samples/blob/main/fcm-notifications/functions/index.js 
        } else {
            return null;
        }

    } else {
        return null;
    }

});

推荐阅读