Подтвердить что ты не робот

Как тестировать облачные функции для Firebase локально на ПК

Сегодня Firebase выпустила свой новый продукт Облачные функции для Firebase, и я просто создал глобальную функцию hello и разворачиваю ее в существующем проекте firebase.

Похоже, что он связывает все зависимости и загружает их в firebase, как это делает aws лямбда-функция. Но требуется слишком много времени даже на незначительные изменения в коде, а также необходимо хорошее подключение к Интернету. Если вы по какой-то причине отключены, вы просто в темноте, какой код вы пишете, пока у вас не будет возможности выполнить и проверить, что функции автономны на вашей локальной машине.

Есть ли способ проверить облачные функции для Firebase локально?

4b9b3361

Ответ 1

firebaser здесь

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

Но на данный момент я в основном пишу свою фактическую бизнес-логику в отдельный Node script. Таким образом, я могу проверить его из локальной командной строки с помощью node speech.js. Как только я доволен, что функция работает, я либо копирую/вставляю ее в свой файл фактических функций, либо (лучше) импортирую модуль speech в свой файл функций и вызывая его оттуда.

Один сокращенный пример, который я быстро откопал, - это когда я подключаю извлечение текста с помощью Cloud Vision API. У меня есть файл с именем 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) могли немного измениться.

Ответ 2

firebaser здесь

Пока нет. Там Облачные функции emulator, но в настоящее время он не поддерживает функции, написанные с использованием Firebase SDK. Поддержка локального эмулятора находится в верхней части нашего списка, и у нас скоро будет что-то.

Ответ 3

Функции запуска локально

https://firebase.google.com/docs/functions/local-emulator

Чтобы использовать эту функцию, инструменты firebase должны иметь минимальную версию 3.8.0, и функции Firebase SDK должны иметь минимальную версию 0.5.7. Обновить оба запускают следующие команды в каталоге functions/для вашего проекта:

npm install --save firebase-functions
npm install -g firebase-tools

Чтобы запускать функции локально, используйте службу firebase:

firebase serve --only functions # to only emulate functions

Осторожно: экспериментальная функция. Это экспериментальная функция, которая в настоящее время поддерживает эмуляцию HTTPS-функций.

UPDATE:

Привет, надежные тестеры,

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

Обратитесь к нашей документации о том, как использовать эту захватывающую новую функцию!

https://firebase.google.com/docs/functions/local-emulator#use_the_cloud_functions_shell

Ответ 4

Отвечено здесь: https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989

Облачные функции Google также открывают локальный эмулятор, и мы работая над построением более тесной интеграции с облачными функциями для Firebase. Между тем, вы можете проверить это здесь: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/

Эмулятор позволяет выполнять функции локально. Здесь документация, в которой объясняется, как ее использовать: https://cloud.google.com/functions/docs/emulator

Ответ 5

Во-первых, я предлагаю вам установить следующие зависимости,

npm install --save firebase-functions
npm install -g firebase-tools 

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

npm install -g @google-cloud/functions-emulator

После обновления перейдите в папку функций вашего приложения и выполните следующую команду:

firebase serve --only functions

Я надеюсь, что это помогает!

Ответ 6

Сначала я не мог заставить работать один шаг. Мой процесс был таким же, как описано во многих ответах здесь.

Кроме того, эти страницы содержат почти всю необходимую мне документацию:

Я firebase serve --only functions, использующие 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 для отладки и надеюсь, что этот ответ кому-нибудь поможет, даже если это старый вопрос.

Ответ 7

Для пользователей 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, чтобы присоединиться к указанному процессу. Теперь вы можете установить точки останова, шаг и т.д. Для любой другой функции (все они используют один и тот же процесс).

Там, наверное, лучший способ склеить все это вместе.

Ответ 8

В настоящее время существует облако эмулятор функций, который позволяет вам называть функции локально

Как только я закончу свой PoC, я обновлю этот ответ, чтобы включить код и шаги, которые я использовал.