Как сделать запуск эмулятора функций Firebase на основе обновления эмулятора базы данных - PullRequest
1 голос
/ 07 февраля 2020

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

  • Использование эмулятора функций Firebase (firebase emulators:start --only functions)
  • Использование оболочки функций firebase (firebase functions:shell)

Во-первых, различия между ними, по крайней мере в связанном руководстве, очень неясны. Для тех, кто читает это в Firebase, было бы неплохо сделать c обновления здесь (учитывая, что локальное тестирование этого материала является такой важной функцией).

Мой фокус в этом вопросе (относительно того, что я пробовал ) основан на эмуляторе, а именно потому, что упоминается, что " взаимодействует с другими службами ". Интересно, что список включает только два элемента:

  • Облачное хранилище файлов
  • Хостинг Firebase

Существует заметное упущение базы данных реального времени, и, возможно, это где разрыв, но здесь мы go.

Моя функция выглядит примерно так:

console.log("Hello World")

exports.myDatabaseTrigger = functions.database.ref('/a/path/{id}').onCreate((data, context) => {
  console.log(`myDatabaseTrigger triggered - here's my path ${data.ref.path}`);

  //manipulate some other stuff in the DB
})

В моем проекте я использую и функции, и базу данных реального времени, поэтому я запускаю команда firebase emulators:start и она запускает оба эмулятора.

В Postman я использую локальный REST API базы данных реального времени для публикации некоторых данных со следующими параметрами:

POST
http://localhost:9000/a/path.json
{
  "some": "data"
}

И я получаю ответ, содержащий имя только что созданного элемента в /a/path. Однако моя функция Firebase никогда не срабатывает, и я никогда не вижу внутренний журнал (хотя журнал Hello World печатает при запуске эмулятора).

Итак, возможно ли взаимодействие между этими двумя эмуляторами? Или я вынужден использовать оболочку функций? Моя проблема с оболочкой заключается в том, что на основе примеров базы данных реального времени неясно, какими будут переменные DataSnapshot (т.е. data.ref.path), если я просто вызову свою функцию с некоторым случайным значением (например, * 1049). *).

1 Ответ

3 голосов
/ 20 февраля 2020

Похоже, вы просто забыли идентификатор проекта / пространства имен.

Попробуйте добавить параметр ?ns= к вашему POST:

POST
http://localhost:9000/a/path.json?ns="YOUR_PROJECT_ID"
{
  "some": "data"
}

Эмулируемые функции * только 1007 * триггер от записи в один экземпляр базы данных, как в рабочей среде.

Что касается вашей путаницы:

  • functions:shell - это просто REPL для функций. Он не эмулирует никакие другие сервисы (база данных, Firestore и т. Д. c). Вместо этого вы напрямую передаете данные, которые будут поступать из этих служб.
  • Если вы хотите проверить функции <-> взаимодействия с базой данных, используйте emulators:start --only database,functions
  • В общем случае правило с emulators:start в том, что мы всесторонне подражаем тому, что работает. Так, например, если вы используете эмулятор функций и базы данных, все записи из функций (через admin.database().... будут перенаправлены в эмулятор базы данных. Но записи в Firestore (admin.firestore()...) попытаются запустить производственный процесс, потому что этот эмулятор не работает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...