Как использовать эмуляторы firebase pubsub для локального тестирования синхронизированных функций?

Я использую firebase для проекта и работаю над созданием функции расписания, используя следующий код. Я хочу регистрировать сообщение каждую минуту, когда это запускается.

export const timedQuery = functions.pubsub.schedule('1 * * * *').onRun((context) => {
console.log("I am running")
return null;
})

У меня есть основная логика кода, работающего под функцией http, и я хотел бы проверить, работает ли это локально, перед развертыванием в производственной среде. Просматривая документы firebase, я скачал все эмуляторы firebase и использовал «эмуляторы firebase: start», чтобы запустить их. Из журналов похоже, что мой эмулятор pubsub успешно запускается на localhost: 8085 и инициализируется функция pubsub, однако даже после ожидания в течение 2–3 минут ничего не распечатывает. Можно ли тестировать запланированные функции локально?

Также я создал это без использования облачного планировщика Google, так как я только использую firebase.


person zeke13210    schedule 16.04.2020    source источник


Ответы (2)


Локальный эмулятор Firebase в настоящее время не имитирует фактические запланированные функции. В документации говорится:

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

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

Я предлагаю отправить запрос функции в службу поддержки Firebase.

Когда вы развертываете запланированную функцию, вы фактически используете Google Cloud Scheduler за кулисами. Детали управляются за вас. Как указано в документации:

Если вы хотите запланировать запуск функций в указанное время, используйте functions.pubsub.schedule (). OnRun () Этот удобный метод создает тему Google Cloud Pub / Sub и использует Google Cloud Scheduler для запуска событий по этой теме, гарантируя, что ваш функция работает по желаемому расписанию.

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

person Doug Stevenson    schedule 16.04.2020
comment
Хорошо, я так понимаю. Если я хочу, чтобы моя запланированная функция работала в реальном времени, мне нужно было бы развернуть ее с помощью firebase deploy правильно? Поскольку в настоящее время нет возможности использовать эмуляторы Firebase для локального тестирования. - person zeke13210; 16.04.2020
comment
Да, вам придется его развернуть. - person Doug Stevenson; 16.04.2020
comment
если да, то для чего нужен эмулятор pubsub? - person Adi Azarya; 25.05.2020
comment
@AdiAzarya для паб-подписок, созданных по темам - person Guilherme Matuella; 15.06.2020
comment
@AdiAzarya Это был очень хороший вопрос. Я имею в виду, что опция была прямо там при запуске init, но эта функция по-прежнему не работает локально. Зачем ??? - person Vixson; 30.11.2020
comment
Этот ответ верен только частично. Вы можете использовать эмулятор PubSub, но без планировщика. И да, лучше, когда логика вашей функции написана как отдельная простая функция JS / TS или как метод класса, а затем просто выполняется с привязкой триггера облачной функции. - person Viacheslav Dobromyslov; 17.01.2021

Собственно есть эмулятор Firebase PubSub. Чтобы включить его, вам необходимо установить последнюю версию интерфейса командной строки (точно в версии 8.2.0).

  • Перезапустить Firebase Init
  • Выберите эмуляторы (пробел)
  • Выберите PubSub (и другие по желанию)
  • Настройте желаемые порты разработчика
  • Попросите CLI установить эмуляторы

Создайте тестовый сценарий локально для отправки сообщений PubSub в очередь:

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

const { PubSub } = require('@google-cloud/pubsub');
const pubsub = new PubSub();

exports.pubsubWriter = functions.https.onRequest(async (req, res) => {
    console.log("Pubsub Emulator:", process.env.PUBSUB_EMULATOR_HOST);

    const msg = await pubsub.topic('test-topic').publishJSON({
        foo: 'bar',
        date: new Date()
    }, { attr1: 'value' });

    res.json({
        published: msg
    })
});
person Arno Zwaag    schedule 30.04.2020
comment
Вы частично правы, потому что это работает только для pubsub, созданного с помощью тем, а не для запланированных, которые запрашивал OP. - person Guilherme Matuella; 15.06.2020
comment
@GuilhermeMatuella, все в порядке. Это решение описано здесь, stackoverflow.com/a/65759654/1177597 и здесь github.com/firebase/firebase-tools/issues/2034. - person Viacheslav Dobromyslov; 17.01.2021
comment
Мне пришлось создать экземпляр @ google-cloud / pubsub с моим идентификатором проекта firebase. - person 1252748; 26.06.2021