【发布时间】:2021-10-06 13:48:20
【问题描述】:
Firebase 实时数据库结构
freepacks 包含两个重要元素:
-
current,这是我将从移动应用下载的测验包ID(从quizpacks检索)。 -
history,这是一个节点,我在其中添加了我在 Cloud Functions 中随时间推移放入current的所有测验包 ID。
每次云功能执行时我需要做什么
第 1 步:在 history 中添加 current 的值和当前时间戳。
第 2 步:将 current 值替换为历史中不的另一个测验包 ID。
完成
我是如何实现这个目标的
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.scheduledFunction = functions.pubsub.schedule('* * * * *').onRun((context) => {
// Current timestamp
const dt = new Date();
const timestamp = `${
(dt.getMonth()+1).toString().padStart(2, '0')}/${
dt.getDate().toString().padStart(2, '0')}/${
dt.getFullYear().toString().padStart(4, '0')} ${
dt.getHours().toString().padStart(2, '0')}:${
dt.getMinutes().toString().padStart(2, '0')}:${
dt.getSeconds().toString().padStart(2, '0')}`
// Download the entire node 'freepacks'
return admin.database().ref('quiz/freepacks').once('value').then((currentSnap) => {
const currentPack = currentSnap.val().current;
// Add current to history
admin.database().ref('quiz/freepacks/history/' + currentPack).set(timestamp);
// Download entire history node
admin.database().ref('quiz/freepacks/history').once('value').then((historySnap) => {
const history = historySnap.val();
console.log('HISTORY: ' + history);
// Download entire quizpacks node
admin.database().ref('quiz/quizpacks').once('value').then((quizpacksSnap) => {
for(quizpack in Object.keys(quizpacksSnap.val())) {
console.log('ITERANDO: ' + quizpack);
// Add the new current if it isn't in history
if (historySnap[quizpack] == undefined) {
admin.database().ref('quiz/freepacks/current').set(quizpack);
break;
}
}
});
})
});
});
我从之前的代码中得到了什么
起点:
首次执行:历史记录更新良好,但更新 current 无效
第二次执行广告等等...
current 不再更新(卡在0)
我在 JavaScript 和 Firebase Admin 方面的经验是 ~0... 我的代码有什么问题?提前感谢您的帮助!
【问题讨论】:
-
下一个
current包应该是什么?for(quizpack in Object.keys(quizpacksSnap.val())) {}这个 for 循环令人困惑。 -
@Dharmaraj 我使用这个 for 循环来迭代测验包中的所有键,并找到第一个不包含在历史记录中的键并放入当前
-
Promise 处理存在问题我正在调查,但您可以将您的数据库共享为 JSON 吗?您可以通过单击右上角的垂直省略号图标将其导出。我测试代码会更容易。
-
@Dharmaraj 是的。我删除了不属于问题的
metadata节点和freepacks内的history节点,应该自动创建:creativadev.altervista.org/db_export.json
标签: node.js firebase-realtime-database google-cloud-functions firebase-admin