我正在创建一个Firebase应用程序,我想在其中存储用户的订阅详细信息。我计划存储订阅的start_date、end_date和number_of_days_left。我想根据结束日期和当前日期之间的差值来计算number_of_days_left。number_of_days_left应在Firebase中每天更新。最好的方法是什么?
要实现所需任务,可以使用Scheduled Firebase Cloud函数。此函数创建Pub/Sub主题,并使用Cloud Scheduler触发该主题上的事件,以确保函数按所需时间表运行。
要存储订阅的start_date
、end_date
和number_of_days_left
,可以使用Cloud Firestore。
首先,您可以在Firestore中创建一个users
集合。并在用户订阅应用程序时添加一个唯一的文档。在文档中,您可以存储类型为timestamp
的字段的start_date
、end_date
和类型为number
的number_of_days_left
。
Firestore数据库结构如下所示-
users------>
user1------>
start_date
end_date
number_of_days_left
user2----->
start_date
end_date
number_of_days_left
user3----->
start_date
end_date
number_of_days_left
现在,您可以实现计划的Firebase功能,并每天更新number_of_days_left
字段。计划的Firebase函数使用Unix Crontab。你可以在这里找到更多关于Unix Crontab语法的信息。以下调度的Firebase函数位于NodeJS中,每天在00:00
运行,并为users
集合中的每个用户更新number_of_days_left
字段。
const admin = require("firebase-admin");
const functions = require("firebase-functions");
admin.initializeApp();
const db=admin.firestore();
exports.scheduledFunctionCrontab = functions.pubsub.schedule("0 0 * * *")
.timeZone("Asia/Kolkata")
// Users can choose timezone - default is America/Los_Angeles
.onRun(async (context) => {
const docRef = await db.collection("users").get();
docRef.forEach((doc)=>{
const data=doc.data();
const difference=Math.
floor((data.end_date-admin.firestore.Timestamp.now())/(24*60*60));
doc.ref.update({"number_of_days_left": difference});
});
});
在功能代码中,您可以指定此处列出的任何有效的timezone
。
要实现这一点,我建议您使用Cloud Scheduler:
Cloud Scheduler是一个完全管理的企业级cron作业调度器。
因此,您可以创建一个cron来每天更新差异。这样,您将始终有一个包含确切剩余天数的字段。