Как вызвать функцию, когда дата, хранящаяся в базе данных firestore, является сегодняшней датой?

Я создаю приложение, в котором мне нужно отправить push-уведомление, когда сегодняшняя дата совпадает с датой, хранящейся в базе данных, для отправки push-уведомления. Как этого добиться?


person Eddy sapata    schedule 23.01.2019    source источник


Ответы (2)


Обновление:

Вместо написания облачной функции HTTPS, которая вызывается через онлайн-сервис CRON Job. Код облачной функции остается точно таким же, меняется только триггер.

Запланированные облачные функции были недоступны на момент написания первоначального ответа.


Не зная вашей модели данных, трудно дать точный ответ, но давайте для упрощения представим, что вы храните в каждом документе поле с именем notifDate в формате DDMMYYY и что эти документы хранятся в коллекции с именем notificationTriggers.

Вы можете написать облачную функцию HTTPS следующим образом:

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)
       });

    });

});

Затем вы будете вызывать эту облачную функцию каждый день с онлайн-сервисом заданий CRON, например https://cron-job.org/en/.

Дополнительные примеры того, как отправлять уведомления в облачных функциях, см. в этих ответах SO Отправка push-уведомления с использованием облачной функции при добавлении нового узла в базу данных Firebase в реальном времени?, ошибка развертывания node.js firebase или Firebase: триггер Cloud Firestore не работает для FCM.

Если вы не знакомы с использованием промисов в облачных функциях, я бы посоветовал вам посмотреть 3 видеоролика о промисах JavaScript из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/

Вы заметите использование Promise.all() в приведенном выше коде, так как вы выполняете несколько асинхронных задач (метод sendToDevice()) параллельно. Об этом подробно рассказано в третьем видео, упомянутом выше.

person Renaud Tarnec    schedule 23.01.2019
comment
Большое спасибо! Оно работает . Но я застрял в другой проблеме - person Eddy sapata; 24.01.2019
comment
Кстати, я использую Onesignal для push-уведомлений..! :) :) - person Eddy sapata; 24.01.2019
comment
@Eddysapata Рад, что смог тебе помочь! Я бы посоветовал вам создать новый вопрос вместо того, чтобы задавать этот вопрос в качестве ответа на ваш первый вопрос. Будущие читатели могут быть озадачены этим ответом, который на самом деле не отвечает на вопрос. - person Renaud Tarnec; 24.01.2019
comment
Да, я согласен . Но вы поняли, не могли бы вы помочь мне в этом.! - person Eddy sapata; 24.01.2019
comment
Да, я, вероятно, мог бы помочь вам. Пожалуйста, задайте новый вопрос. - person Renaud Tarnec; 24.01.2019
comment
Пожалуйста, помогите. stackoverflow.com/questions/54347676/ - person Eddy sapata; 24.01.2019

Используйте запланированные триггеры Google Cloud Functions https://cloud.google.com/scheduler/docs/tut-pub-sub

Используя запланированный триггер, вы можете указать, сколько раз вызывать вашу функцию, указав частоту, используя формат unix-cron. Затем внутри функции вы можете выполнить проверку даты и другую необходимую логику.

person Mocas    schedule 23.01.2019
comment
Не планируете использовать AppEngine. Извините.. Спасибо за ваше время. :) - person Eddy sapata; 24.01.2019