Итак, история выглядит примерно так ... Я работал над созданием приложения iOS с использованием swift с несколькими людьми, и мы решили использовать firebase в качестве решения для базы данных. Когда мы создавали приложение, мы столкнулись со сценарием, когда приложение действительно не имело смысла запускать этот код, скорее было бы разумно запускать его на сервере каждый день в полночь.

К счастью, недавно в Firebase появилась возможность писать облачные функции:



Вы можете взглянуть на документацию, чтобы найти то, что лучше всего подходит для вас с учетом того, чего вы пытаетесь достичь. Как я уже упоминал, мы пытались заставить функцию работать по заданному расписанию. На самом деле у firebase нет определенного способа сделать это. Для запуска всех функций firebase требуется какой-то внешний триггер. Чтобы обойти это, я создал функцию, которая запускалась через HTTP-запрос на получение, и использовал www.cron-job.org для инициации запроса каждый день в полночь.

Настройка функции:

Я очень быстро понял, что эти функции должны быть написаны на node.js, поэтому мне пришлось придумать новый синтаксис, но это было неплохо ...

Поскольку я никогда ничего не писал на javascript, мне пришлось немного настроить среду, установив Node.js и npm, которые можно установить через nodejs.org.

Как только это будет сделано в консоли, запустите:

npm install -g firebase-tools

Тогда беги

firebase login

И, наконец, перейдите в каталог проекта firebase и запустите

firebase init functions

Я всегда нажимаю «да», когда он просит установить зависимости, но я знаю, что есть способ сделать это другим способом, если вы того пожелаете.

Как только это будет сделано, у вас должна появиться новая папка функций внутри вашего проекта с файлом index.js.

Когда вы открываете его, вы хотите добавить следующее:

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

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

Это загружает ваши функции и модуль администратора в firebase. Инициализация позволяет вам получить доступ к базе данных в реальном времени и управлять ею.

Теперь вы можете приступить к выполнению своих функций. Для HTTP-запроса я сделал следующее:

//Initial function call:
exports.checkChallenges = functions.https.onRequest((req, res) => {
  //create database ref
  var dbRef = admin.database().ref('/challenges');
  //do a bunch of stuff

  //send back response 
  res.redirect(200);
});

URL-адрес, который вы хотите использовать для этого запроса, будет выглядеть, как показано ниже, где MY_PROJECT - это идентификатор проекта вашего приложения, расположенный в настройках вашего проекта в Firebase.

https://us-central1-MY_PROJECT.cloudfunctions.net/checkChallenges

Наконец, чтобы развернуть эту функцию, вам нужно:

firebase deploy --only functions

Как только вы это сделаете, вы должны увидеть имя своей функции, указанное на вкладке функций вашего проекта, на этой вкладке также есть доступ к консоли, где вы можете увидеть любые ошибки или журналы, связанные с запуском вашей функции.

Вот и все.

Советы для пар:

Если вы похожи на меня и у вас есть база на iOS, мы обычно используем .observe, .set и .update для получения / изменения данных в firebase. Хотя в javascript есть те же методы, одна важная вещь, которую нужно сделать, если вам нужно получить данные, а затем манипулировать и установить те же данные, - использовать .transaction. Например:

function giveTrophies(challengeID, userID, trophy) { 
  var dbRef = admin.database().ref('/users/' + userID);
      dbRef.child('trophies').child(trophy).transaction(function(currentValue) {
    return currentValue + 1
  });
}

Облачные функции Firebase также имеют ограничения квот, которые можно найти здесь.

Наконец, не забывайте, что он все еще находится в стадии бета-тестирования.

Удачного кодирования.