Как использовать планировщик для облачных функций Firebase с триггерами базы данных / аналитики в реальном времени? - PullRequest
0 голосов
/ 02 мая 2019

Я работаю над облачной функцией Firebase, чтобы отправлять инициированные push-уведомления.Прямо сейчас моя функция отправляет push, как только пользователь запускает событие «IAP» в моем приложении.

'use strict';

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

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendIAPAnalytics = functions.analytics.event('IAP').onLog((event) => {

    const user = event.user;
    const uid = user.userId; // The user ID set via the setUserId API.   

    sendPushToUser();

    return true;
});


function sendPushToUser(uid) {
  // Fetching all the user's device tokens.

     var ref = admin.database().ref(`/users/${uid}/tokens`);

     return ref.once("value", function(snapshot){
         const payload = {
              notification: {
                  title: 'Hello',
                  body: 'Open the push'
              }
         };

        console.log("sendPushToUser ready");

         admin.messaging().sendToDevice(snapshot.val(), payload)

    }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
    });
}

Эта функция работает, push отправляются и принимаются.

Я прочитал некоторыеновости о планировании для Firebase Cloud Функции:

Я понял, это только для триггеров HTTP или PUB / SUBтриггеры.Поэтому сейчас всегда невозможно запускать функции с задержками, записывая их в базу данных в реальном времени или когда запускаются аналитические события.

Я прав?или есть хитрость?

Я ничего не читал об этом.

РЕДАКТИРОВАТЬ: Официальная документация https://firebase.google.com/docs/functions/schedule-functions

Мой синтаксис неправильный, но мне нужно что-то вроде этого:

function sendPushToUser(uid) {

     var ref = admin.database().ref(`/users/${uid}/tokens`);

     return ref.once("value", function(snapshot){
         const payload = {
              notification: {
                  title: 'Hello',
                  body: 'Open the push'
              }
         };


    functions.pubsub.schedule('at now + 10 mins').onRun((context) => {
       admin.messaging().sendToDevice(snapshot.val(), payload)

    })

    }, function (errorObject) {
        console.log("The read failed: " + errorObject.code);
    });
}

1 Ответ

1 голос
/ 02 мая 2019

Нет встроенного способа перезапуска облачных функций с задержкой.Если вам нужна такая функциональность, вам придется создать ее самостоятельно, например, запланировав периодическое выполнение функции, а затем посмотреть, какие задачи необходимо запустить.Смотрите мой ответ здесь: Задержка облачной функции Google

Как прокомментировал Даг, вы можете использовать Облачные задачи для планирования отдельных вызовов.Вы бы динамически создали задачу, а затем вызвали ее функцию HTTP.

...