当存储在Firestore数据库中的日期是今天的日期时,如何触发功能?

时间:2019-01-23 08:44:53

标签: firebase react-native google-cloud-firestore google-cloud-functions onesignal

我正在创建一个应用程序,当今天的日期与数据库中存储的日期匹配时,我需要在其中发送推送通知,以便发送推送通知。 如何实现呢?

2 个答案:

答案 0 :(得分:1)

在不知道您的数据模型的情况下,很难给出准确的答案,但是为了简化起见,我们想像一下,您在每个文档中存储了一个名为notifDate且格式为DDMMYYY的字段,并且这些文档存储在一个Collection中。名为notificationTriggers

您可以编写如下的HTTPS Cloud Function:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const cors = require('cors')({ origin: true });
const moment = require('moment');

admin.initializeApp();

exports.sendDailyNotifications = functions.https.onRequest((request, response) => {

    cors(request, response, () => {

       const now = moment();
       const dateFormatted = now.format('DDMMYYYY');

       admin.firestore()
       .collection("notificationTriggers").where("notifDate", "==", dateFormatted)
       .get()
       .then(function(querySnapshot) {

           const promises = []; 

           querySnapshot.forEach(doc => {

               const tokenId = doc.data().tokenId;  //Assumption: the tokenId is in the doc
               const notificationContent = {
                 notification: {
                    title: "...",
                    body: "...",  //maybe use some data from the doc, e.g  doc.data().notificationContent
                    icon: "default",
                    sound : "default"
                 }
              };

              promises
              .push(admin.messaging().sendToDevice(tokenId, notificationContent));      

          });
          return Promise.all(promises);
       })
       .then(results => {
            response.send(data)
       })
       .catch(error => {
          console.log(error)
          response.status(500).send(error)
       });

    });

});

然后,您每天都可以通过https://cron-job.org/en/之类的在线CRON作业服务来调用此Cloud Function。

有关如何在Cloud Functions中发送通知的更多示例,请查看这些SO答案Sending push notification using cloud function when a new node is added in firebase realtime database?node.js firebase deploy errorFirebase: Cloud Firestore trigger not working for FCM

如果您不熟悉在Cloud Functions中使用Promises,我建议您观看Firebase视频系列中有关“ JavaScript Promises”的3个视频:https://firebase.google.com/docs/functions/video-series/

您将注意到上面的代码中使用Promise.all(),因为您正在并行执行多个异步任务(sendToDevice()方法)。这在上面提到的第三个视频中有详细介绍。

答案 1 :(得分:0)

使用Google Cloud Functions计划的触发器 https://cloud.google.com/scheduler/docs/tut-pub-sub

使用计划的触发器,您可以通过使用unix-cron格式指定频率来指定调用函数的次数。然后在该函数中,您可以进行日期检查和其他所需的逻辑