Короче говоря, я хочу протестировать функцию 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). *).