Как проверить облачные функции для Firebase локально на ПК
Сегодня Firebase выпустила новый продукт Cloud Functions for Firebase, и я только что создал функцию hello world и развернул ее в своем существующем проекте firebase.
Похоже, что он объединяет все зависимости и загружает его в firebase, как это делает лямбда-функция aws. Но это занимает слишком много времени, чтобы сделать это даже при незначительных изменениях в коде, а также требует хорошего подключения к Интернету. Если вы по какой-то причине не в сети, вы просто не знаете, какой код вы пишете, пока у вас не будет способа выполнить и протестировать эти функции в автономном режиме на локальном компьютере.
Есть ли способ проверить облачные функции для Firebase локально?
7 ответов
пожарный здесь
Развертывание ваших функций действительно занимает больше времени, чем я обычно готов ждать. Мы прилагаем все усилия, чтобы улучшить это и (как сказал Брендан) работаем над локальным эмулятором.
Но на данный момент я в основном пишу свою настоящую бизнес-логику в отдельный скрипт Node. Таким образом, я могу проверить это из локальной командной строки с node speech.js
, Как только я убедился, что функция работает, я либо копирую / вставляю ее в свой текущий файл функций, либо (лучше) импортирую speech
модуль в мой файл функций и вызвать его оттуда.
Один сокращенный пример, который я быстро выкопал, - это когда я подключал извлечение текста с помощью API Cloud Vision. У меня есть файл с именем ocr.js
который содержит:
var fetch = require('node-fetch');
function extract_text(url, gcloud_authorization) {
console.log('extract_text from image '+url+' with authorization '+gcloud_authorization);
return fetch(url).then(function(res) {
return res.buffer();
}).then(function(buffer) {
return fetch('https://vision.googleapis.com/v1/images:annotate?key='+gcloud_authorization, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"requests":[
{
"image":{
"content": buffer.toString('base64')
},
"features":[
{
"type":"TEXT_DETECTION",
"maxResults":1
}
]
}
]
})
});
}).then(function(res) {
var json = res.json();
if (res.status >= 200 && res.status < 300) {
return json;
} else {
return json.then(Promise.reject.bind(Promise));
}
}).then(function(json) {
if (json.responses && json.responses.length && json.responses[0].error) {
return Promise.reject(json.responses[0].error);
}
return json.responses[0].textAnnotations[0].description;
});
}
if (process.argv.length > 2) {
// by passing the image URL and gcloud access token, you can test this module
process.argv.forEach(a => console.log(a));
extract_text(
process.argv[2], // image URL
process.argv[3] // gcloud access token or API key
).then(function(description) {
console.log(description);
}).catch(function(error) {
console.error(error);
});
}
exports.extract_text = extract_text;
И тогда в моих функциях index.js я имею:
var functions = require('firebase-functions');
var fetch = require('node-fetch');
var ocr = require('./ocr.js');
exports.ocr = functions.database().path('/messages/{room}/{id}').onWrite(function(event) {
console.log('OCR triggered for /messages/'+event.params.room+'/'+event.params.id);
if (!event.data || !event.data.exists()) return;
if (event.data.ocr) return;
if (event.data.val().text.indexOf("https://firebasestorage.googleapis.com/") !== 0) return; // only OCR images
console.log(JSON.stringify(functions.env));
return ocr.extract_text(event.data.val().text, functions.env.googlecloud.apikey).then(function(text) {
return event.data.adminRef.update({ ocr: text });
});
});
Итак, как вы можете видеть, этот последний файл на самом деле просто о подключении "рабочего метода" ocr.extract_text
к местоположению базы данных.
Обратите внимание, что это проект давно, поэтому некоторые из синтаксиса (в основном functions.env
часть), возможно, немного изменился.
пожарный здесь
Еще нет. Есть эмулятор Cloud Functions, но в настоящее время он не поддерживает функции, написанные с использованием Firebase SDK. Локальная поддержка эмулятора находится на вершине нашего списка, и у нас будет кое-что скоро.
Запускать функции локально
https://firebase.google.com/docs/functions/local-emulator
Чтобы использовать эту функцию, firebase-tools должны иметь минимальную версию 3.8.0, а firebase-functions SDK должен иметь минимальную версию 0.5.7. Чтобы обновить оба, выполните следующие команды в каталоге functions / для вашего проекта:
npm install --save firebase-functions npm install -g firebase-tools
Для локального запуска функций используйте firebase serve:
firebase serve --only functions # to only emulate functions
Внимание: Экспериментальная особенность. Это экспериментальная функция, которая в настоящее время поддерживает только эмуляцию функций HTTPS.
ОБНОВИТЬ:
Привет функции надежных тестеров,
Мы только что выпустили firebase-tools v3.11.0, который поддерживает интерактивную оболочку для эмуляции всех типов функций и вызова их с тестовыми данными. Спасибо многим из вас за участие в сеансах обратной связи по этой функции.
Обратитесь к нашей документации, чтобы узнать, как использовать эту замечательную новую функцию!
>> Есть ли способ протестировать облачные функции для Firebase локально?
Вы можете использовать следующую команду для запуска оболочки firebase (выполнить в каталоге функций):
npm run build && firebase functions:shell
Вы можете вызывать свои функции в оболочке следующим образом:
helloWorld()
Перейдите по этой ссылке для получения дополнительной информации.
Ответили здесь: https://github.com/firebase/firebase-functions/issues/4
Google Cloud Functions также открыл локальный эмулятор, и мы работаем над созданием более тесной интеграции с Cloud Functions для Firebase. Между тем, вы можете проверить это здесь: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/
Эмулятор позволяет запускать функции локально. Вот документация, которая объясняет, как его использовать: https://cloud.google.com/functions/docs/emulator
Сначала я не мог заставить работать один шаг. Мой процесс был таким же, как описано во многих ответах здесь.
Кроме того, эти страницы содержат почти всю необходимую мне документацию:
- https://firebase.google.com/docs/functions/local-emulator
- https://cloud.google.com/functions/docs/emulator
У меня есть функции, работающие с использованием firebase serve --only functions
, но не запустил отладчик. Затем я наткнулся на другой способ непосредственного использования эмулятора и смог достичь точки останова, например:
# start the emulator
functions start
# allow inspection
functions inspect helloWorld
# call the function from the cli
functions call helloWorld
Это сработало, и я мог достичь точки останова.
Однако, когда я нажал конечную точку для функции в почтальоне или браузере, я не получил никакого ответа.
Шаг, который я пропустил, был:
# deploy the function to the emulator
functions deploy helloWorld --trigger-http
# you need to toggle inspection after the deploy
functions inspect helloWorld
Теперь я могу нажать конечную точку для функции от почтальона или браузера, и точка останова достигнута.
Я рекомендую блестящее расширение NiM chrome для отладки и надеюсь, что этот ответ кому-нибудь поможет, даже если это старый вопрос.
Для пользователей vscode, отлаживающих функции HTTP (webhooks и т. Д.)...
Облачный эмулятор Google (firebase serve --only functions
) запускает отдельный процесс для запуска ваших функций. Вы можете присоединиться к этому процессу с помощью vscode, но поскольку эмулятор создает этот процесс только после вызова первой функции, это не так просто.
- создайте фиктивную конечную точку HTTP в ваших функциях, которая будет возвращать processID:
app.get("/processid", function(request, response) {
response.send(`${process.pid}`);
});
- запустить эмулятор с
firebase serve --only functions
- позвонить
http://<localhost_url>/processid
конечная точка. Это создаст процесс и вернет processID - используйте vscode, чтобы присоединиться к указанному процессу. Теперь вы можете установить точки останова, шаг и т. Д. Для любых других функций (все они используют один и тот же процесс).
Возможно, есть лучший способ склеить все это.
Во-первых, я предлагаю вам установить следующие зависимости,
npm install --save firebase-functions
npm install -g firebase-tools
Если он уже установлен, вы можете обновить его до последней версии. Как правило, функции-эмулятор имеют вышеуказанную зависимость, но я бы порекомендовал вам обновить его,
npm install -g @google-cloud/functions-emulator
После обновления перейдите в папку функций вашего приложения и выполните следующую команду:
firebase serve --only functions
Я надеюсь, что это помогает!
Теперь есть эмулятор облачных функций, который позволяет вам вызывать функции локально
После того, как я закончу PoC, я обновлю этот ответ, чтобы включить код и шаги, которые я использовал.