wake-up-neo.com

so testen Sie Cloud-Funktionen für Firebase lokal auf dem PC

Heute hat Firebase sein brandneues Produkt Cloud Functions für Firebase veröffentlicht, und ich habe gerade eine Hello World-Funktion erstellt und in meinem vorhandenen Firebase-Projekt implementiert.

Es sieht so aus, als würde es alle Abhängigkeiten bündeln und in die Firebase hochladen, genau wie aws lambda function. Es dauert jedoch zu viel Zeit, um selbst bei geringfügigen Codeänderungen und einer guten Internetverbindung zu arbeiten. Wenn Sie aus irgendeinem Grund offline sind, wissen Sie gerade nicht, welchen Code Sie schreiben, bis Sie die Möglichkeit haben, die Funktionen offline auf Ihrem lokalen Computer auszuführen und zu testen.

Gibt es eine Möglichkeit, Cloud-Funktionen für Firebase lokal zu testen?

25
Inzamam Malik

Feuerball hier

Die Bereitstellung Ihrer Funktionen dauert tatsächlich länger als das, worauf ich normalerweise warten möchte. Wir arbeiten hart daran, das zu verbessern und arbeiten (wie Brendan sagte) an einem lokalen Emulator.

Aber im Moment schreibe ich meine eigentliche Geschäftslogik zuerst in ein separates Node-Skript. Auf diese Weise kann ich es mit einem node speech.js von einem lokalen Befehl aus testen. Sobald ich mit der Funktion zufrieden bin, kopiere oder füge ich sie in meine eigentliche Funktionsdatei ein oder importiere (besser) das speech-Modul in meine Funktionsdatei und rufe es von dort auf.

Ein abgekürztes Beispiel, das ich schnell herausgearbeitet habe, ist die Verdrahtung der Textextraktion mit der Cloud Vision-API. Ich habe eine Datei namens ocr.js, die enthält:

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;

Und dann in meinen Funktionen index.js habe ich:

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 });
  });
});

Wie Sie sehen können, handelt es sich bei der letzten Datei also nur um die Verknüpfung der "Workermethode" ocr.extract_text mit dem Datenbankspeicherort.

Beachten Sie, dass dies ein Projekt von vor einiger Zeit ist, daher haben sich einige der Syntax (meistens der functions.env-Teil) möglicherweise etwas geändert.

22

Feuerball hier

Um Ihre Cloud-Funktionen für Firebase lokal zu debuggen, gibt es einen Emulator. In der Dokumentation finden Sie weitere Informationen .

16
Brendan G. Lim

Funktionen lokal ausführen

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

Um diese Funktion verwenden zu können, müssen Firebase-Tools über die Mindestversion 3.8.0 .__ verfügen. und das Firebase-Funktions-SDK muss mindestens Version 0.5.7 haben. Aktualisieren Führen Sie in beiden Fällen die folgenden Befehle im Verzeichnis Functions/Ihres Projekts aus:

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

Um Funktionen lokal auszuführen, verwenden Sie den Firebase-Server:

firebase serve --only functions # to only emulate functions

Vorsicht: Experimentelles Feature. Dies ist eine experimentelle Funktion, die derzeit nur die Emulation von HTTPS-Funktionen unterstützt.

UPDATE:

Hey Functions Trusted Tester, 

Wir haben gerade firebase-tools v3.11.0 veröffentlicht, die ein interaktives .__ unterstützen. Shell zum Emulieren aller Arten von Funktionen und Aufrufen mit Testdaten. Vielen Dank für Ihre Teilnahme an Feedback Sitzungen zu dieser Funktion. 

In unserer Dokumentation erfahren Sie, wie Sie diese aufregende neue Funktion verwenden können!

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

9
Inzamam Malik

Hier beantwortet: https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989

Google Cloud-Funktionen haben auch einen lokalen Emulator auf Open Source-Basis bereitgestellt. Arbeiten Sie an einer engeren Integration mit Cloud-Funktionen für Firebase In der Zwischenzeit können Sie es hier überprüfen: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/

Mit dem Emulator können Sie Funktionen lokal ausführen. Hier ist die Dokumentation, die die Verwendung erläutert: https://cloud.google.com/functions/docs/emulator

1
Inzamam Malik

Für vscode-Benutzer, die HTTP-Funktionen (Webhooks usw.) debuggen ...

Der Google Cloud-Emulator (firebase serve --only functions) startet einen separaten Prozess zum Ausführen Ihrer Funktionen. Sie können mit vscode eine Verbindung zu diesem Prozess herstellen. Da der Emulator jedoch nur diesen Prozess erstellt after die erste Funktion aufgerufen wird, ist dies nicht einfach.

  • erstellen Sie in Ihren Funktionen einen Dummy-HTTP-Endpunkt, der die Prozess-ID zurückgibt:
app.get("/processid", function(request, response) {
  response.send(`${process.pid}`);
});
  • starten Sie den Emulator mit firebase serve --only functions
  • rufen Sie den http://<localhost_url>/processid-Endpunkt auf. Dadurch wird der Prozess erstellt und die Prozess-ID zurückgegeben
  • verwenden Sie vscode, um eine Verbindung zum angegebenen Prozess herzustellen. Sie können jetzt Haltepunkte, Schritte usw. für alle anderen Funktionen festlegen (alle verwenden den gleichen Prozess).

Es gibt wahrscheinlich eine schönere Art, all das zusammenzukleben.

0
adelphus

Ich konnte den Einzelschritt zunächst nicht zum Laufen bringen. Mein Prozess war der gleiche wie in vielen Antworten hier dokumentiert.

Diese Seiten enthalten auch fast alle erforderlichen Dokumentationen:

Ich hatte die Funktionen mit firebase serve --only functions ausgeführt, den Debugger jedoch nicht in Betrieb genommen. Dann kam ich auf die andere Art, den Emulator direkt zu verwenden, und erreichte einen Haltepunkt wie diesen:

# start the emulator
functions start

# allow inspection
functions inspect helloWorld

# call the function from the cli
functions call helloWorld

Das funktionierte und ich konnte einen Haltepunkt erreichen.

Beim Erreichen des Endpunkts für die Funktion im Postboten oder im Browser erhielt ich jedoch keine Antwort.

Der Schritt, den ich vermisst habe, war:

# deploy the function to the emulator
functions deploy helloWorld --trigger-http

# you need to toggle inspection after the deploy
functions inspect helloWorld

Jetzt kann ich den Endpunkt für die Funktion vom Postboten oder vom Browser erreichen, und der Haltepunkt ist erreicht.

Ich empfehle die brillante NiM-Chrom-Erweiterung zum Debuggen und hoffe, diese Antwort hilft jemandem, auch wenn dies eine alte Frage ist.

0
plumpNation

Zuerst schlage ich vor, folgende Abhängigkeiten zu installieren:

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

Wenn bereits installiert, können Sie es auf den neuesten Stand bringen. Im Allgemeinen ist der Funktionsemulator mit der oben genannten Abhängigkeit ausgestattet, dennoch würde ich Ihnen empfehlen, ihn zu aktualisieren.

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

Wechseln Sie nach der Aktualisierung zum Funktionsordner Ihrer Anwendung und führen Sie den folgenden Befehl aus:

firebase serve --only functions

Ich hoffe, es hilft!

0
imbond