Работа Cron в Google Cloud Functions не работает

Я пытаюсь настроить запланированную функцию в Firebase Cloud Functions. В качестве простого теста я попытался воссоздать образец, показанный на странице документации:

const functions = require('firebase-functions')

exports.scheduledFunction = functions.pubsub
  .schedule('every 5 minutes')
  .onRun(context => {
    console.log('This will be run every 5 minutes!')
    return null
  })

Однако когда я запускаю firebase serve --only functions, я получаю следующую ошибку:

function ignored because the pubsub emulator does not exist or is not running.

Есть идеи, почему я получаю это сообщение и как его исправить?


person Moshe    schedule 15.12.2019    source источник
comment
Это НЕ повторяющийся вопрос. Этот вопрос касается того, почему я не могу запустить запланированную облачную функцию с помощью команды firebase serve. Другой вопрос - как запустить запланированную облачную функцию с вызовом api.   -  person Moshe    schedule 15.12.2019
comment
Должен отметить, что мне все равно хотелось бы получить ответ на этот вопрос, даже если на другой вопрос был дан правильный ответ. Как я отмечал в своем предыдущем комментарии, они задают два разных вопроса. Не могли бы вы снова открыть этот вопрос? Спасибо.   -  person Moshe    schedule 15.12.2019
comment
Выполнено. Извините за ошибку, так как это действительно явно другой вопрос, чем тот, который я связал.   -  person Frank van Puffelen    schedule 16.12.2019
comment
Спасибо - и не беспокойтесь. Я понимаю, что названия были очень похожи - я должен был быть яснее в своем названии.   -  person Moshe    schedule 16.12.2019


Ответы (2)


Из документации по локальному эмулятору Firebase:

Интерфейс командной строки Firebase включает эмулятор облачных функций, который может эмулировать следующие типы функций:

  • HTTPS функции
  • Вызываемые функции
  • Функции Cloud Firestore

Таким образом, локальные эмуляторы Firebase в настоящее время не поддерживают pubsub, и сообщение об ошибке, похоже, подтверждает это. Итак, на данный момент вы не можете запускать облачные функции, запускаемые pubsub, локально.

Был подан запрос функции для добавления поддержки PubSub в эмулятор. Возможно, вы захотите прочитать (и, возможно, прокомментировать) там, поскольку выбранное направление может или не может совпадать с вашими потребностями.

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

person Frank van Puffelen    schedule 15.12.2019
comment
Спасибо - вот что мне нужно было знать. Очень признателен. - person Moshe; 16.12.2019

Для чего вам нужно включить эмулятор pubsub в firebase. Добавьте это в свой блок эмуляторов:

{
  "emulators": {
    "pubsub": {
      "port": 8085
    },
  }
}

Но даже тогда это только создает определение. Эмулятор не поддерживает запуск функции по расписанию.

Чтобы смоделировать это поведение, я определяю триггер HTTP, в котором я вручную отправляю сообщение в тему. Для темы расписания это firebase-schedule- ‹functionName›. В вашем случае это будет firebase-schedule-scheduleFunction.

Пример кода выглядит так:

const pubsub = new PubSub()

export const triggerWork = functions.https.onRequest(async (request, response) => {
  await pubsub.topic('firebase-schedule-scheduledFunction').publishJSON({})
  response.send('Ok')
})

Затем в командной строке я запускаю функцию HTTP по расписанию.

while [ 1 ];
  do wget -o /dev/null -O /dev/null http://localhost:5001/path/to/function/triggerWork;
  sleep 300;
done
person Mere Vicharr    schedule 26.07.2020
comment
Это было действительно полезно для меня! Для всех, у кого есть проблемы с этим, новое соглашение для темы pubsub - firebase-schedule- ‹function_name› - ‹region›, например. firebase-запланированный-запланированныйFunctionCrontab-us-east1. firebase.google.com/docs/functions/schedule-functions - person dnishiyama; 20.06.2021