android - 仅当来自实时数据库的值等于 X 时,如何执行 Firebase 计划功能?
问题描述
我开始在 Android Studio 的 adnroid 应用程序中使用 Firebase 云功能进行冒险,但我没有这方面的经验。更重要的是,我以前从未使用过 javascript,所以一切对我来说似乎都是新的。我想知道我是否可以制作一个像这样工作的预定功能:
- 首先,函数检查来自实时数据库的值是否不为零。
- 如果不是,则函数检查来自实时数据库的另一个值是否不大于 7。
- 如果不是,则数据库中的值增加 1。
- 然后发送通知。
我创建了测试功能来检查数据库中的数据是否被正确获取,但它执行时出现错误“未定义 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);
});
解决方案
在 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;
}
});
推荐阅读
- vb.net - 如何仔细检查文件夹是否为空`?
- c# - MVVM 视图切换 - 在 InitializeComponent 之后未填充新视图数据上下文
- django - 如何在多对多关系django中访问选定名称的ID
- javascript - 在同一行返回箭头函数,打字稿
- pdf - Solr 添加和更新 pdf 文件
- c++ - 覆盖派生类中的二元运算符
- mysql - 无法将 MediaWiki 从 MySQL 迁移到 PostgreSQL
- vue.js - Vuetify 数据表自定义标头在移动设备中不起作用
- azure - 根据传入请求标头将请求转发到 Azure 应用程序网关后端池
- javascript - 在 discord.js 中获取视频 url 并使用 Youtube Api 时 Promise Rejection