Erste Schritte: Erste Funktionen schreiben, testen und bereitstellen


Wenn Sie mit Cloud Functions beginnen möchten, können Sie diese Anleitung durcharbeiten. Sie beginnt mit den erforderlichen Einrichtungsaufgaben und führt Sie durch das Erstellen, Testen und Bereitstellen von zwei zusammengehörigen Funktionen:

  • Eine Funktion zum Hinzufügen von Nachrichten, die eine URL bereitstellt, die einen Textwert akzeptiert und in Cloud Firestore schreibt.
  • Eine Funktion zum Umwandeln in Großbuchstaben, die bei einem Cloud Firestore-Schreibvorgang ausgelöst wird und den Text in Großbuchstaben umwandelt.

Wir haben Cloud Firestore und HTTP-ausgelöste JavaScript-Funktionen für dieses Beispiel unter anderem deshalb ausgewählt, weil diese Hintergrundtrigger über die Firebase Local Emulator Suite gründlich getestet werden können. Dieses Toolset unterstützt auch Realtime Database-, PubSub-, Auth- und HTTP-aufrufbare Trigger. Andere Arten von Hintergrundtriggern wie Remote Config-, TestLab- und Analytics-Trigger können alle interaktiv mit Toolsets getestet werden, die auf dieser Seite nicht beschrieben werden.

In den folgenden Abschnitten dieser Anleitung werden die Schritte beschrieben, die zum Erstellen, Testen und Bereitstellen des Beispiels erforderlich sind. Wenn Sie den Code lieber nur ausführen und prüfen möchten, springen Sie zu Vollständigen Beispielcode ansehen.

Firebase-Projekt erstellen

  1. Klicken Sie in der Firebase-Konsole auf Projekt hinzufügen.

    • Wenn Sie einem vorhandenen Google Cloud-Projekt Firebase-Ressourcen hinzufügen möchten, geben Sie den Projektnamen ein oder wählen Sie das Projekt aus dem Drop-down-Menü aus.

    • Wenn Sie ein neues Projekt erstellen möchten, geben Sie einen Projektnamen ein. Optional können Sie auch die Projekt-ID bearbeiten, die unter dem Projektnamen angezeigt wird.

  2. Lesen Sie sich die Nutzungsbedingungen von Firebase durch und akzeptieren Sie sie.

  3. Klicken Sie auf Weiter.

  4. (Optional) Richten Sie Google Analytics für Ihr Projekt ein. So können Sie die folgenden Firebase-Produkte optimal nutzen: Firebase A/B Testing, Cloud Messaging, Crashlytics, In-App Messaging und Remote Config (einschließlich Personalisierung).

    Wählen Sie entweder ein vorhandenes Google Analytics-Konto aus oder erstellen Sie ein neues Konto. Wenn Sie ein neues Konto erstellen, wählen Sie den Analytics-Berichtsspeicherort aus und akzeptieren Sie dann die Datenfreigabeeinstellungen und die Google Analytics-Nutzungsbedingungen für Ihr Projekt.

  5. Klicken Sie auf Projekt erstellen (oder auf Firebase hinzufügen, wenn Sie Firebase einem vorhandenen Google Cloud-Projekt hinzufügen).

Firebase stellt automatisch Ressourcen für Ihr Firebase-Projekt bereit. Nach Abschluss des Vorgangs werden Sie zur Übersichtsseite für Ihr Firebase-Projekt in der Firebase Console weitergeleitet.

Node.js und die Firebase CLI einrichten

Sie benötigen eine Node.js-Umgebung, um Funktionen zu schreiben, und die Firebase-Befehlszeile, um Funktionen in der Cloud Functions-Laufzeit bereitzustellen. Für die Installation von Node.js und npm wird der Node Version Manager empfohlen.

Nachdem Sie Node.js und npm installiert haben, installieren Sie das Firebase-CLI mit der gewünschten Methode. So installieren Sie die CLI über npm:

npm install -g firebase-tools

Dadurch wird der global verfügbare Firebase-Befehl installiert. Wenn der Befehl fehlschlägt, müssen Sie möglicherweise die npm-Berechtigungen ändern. Wenn Sie auf die neueste Version von firebase-tools aktualisieren möchten, führen Sie denselben Befehl noch einmal aus.

Projekt initialisieren

Wenn Sie das Firebase SDK für Cloud Functions initialisieren, erstellen Sie ein leeres Projekt mit Abhängigkeiten und minimalem Beispielcode. Außerdem wählen Sie entweder TypeScript oder JavaScript zum Erstellen von Funktionen aus. Für diese Anleitung müssen Sie auch Cloud Firestore initialisieren.

So initialisieren Sie Ihr Projekt:

  1. Führen Sie firebase login aus, um sich über den Browser anzumelden und die Firebase-Befehlszeile zu authentifizieren.

  2. Wechseln Sie zum Verzeichnis Ihres Firebase-Projekts.

  3. Führen Sie firebase init firestore aus. Für diese Anleitung können Sie die Standardwerte akzeptieren, wenn Sie nach Firestore-Regeln und Indexdateien gefragt werden. Wenn Sie Cloud Firestore in diesem Projekt noch nicht verwendet haben, müssen Sie auch einen Startmodus und einen Standort für Firestore auswählen, wie unter Erste Schritte mit Cloud Firestore beschrieben.

  4. Führen Sie firebase init functions aus. In der CLI werden Sie aufgefordert, eine vorhandene Codebasis auszuwählen oder eine neue zu initialisieren und zu benennen. Wenn Sie gerade erst anfangen, reicht eine einzelne Codebasis am Standardspeicherort aus. Später, wenn Ihre Implementierung umfangreicher wird, sollten Sie Funktionen in Codebasen organisieren.

  5. Die Befehlszeile bietet die folgenden Optionen für die Sprachunterstützung:

    Wählen Sie für diese Anleitung JavaScript aus.

  6. Mit der CLI können Sie Abhängigkeiten mit npm installieren. Sie können die Aufforderung ablehnen, wenn Sie Abhängigkeiten auf andere Weise verwalten möchten. Wenn Sie die Aufforderung ablehnen, müssen Sie npm install ausführen, bevor Sie Ihre Funktionen emulieren oder bereitstellen.

Nachdem diese Befehle erfolgreich ausgeführt wurden, sieht Ihre Projektstruktur so aus:

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

Die während der Initialisierung erstellte Datei package.json enthält einen wichtigen Schlüssel: "engines": {"node": "16"}. Damit wird die Node.js-Version für das Schreiben und Bereitstellen von Funktionen angegeben. Sie können andere unterstützte Versionen auswählen.

Erforderliche Module importieren und eine App initialisieren

Nachdem Sie die Einrichtungsaufgaben abgeschlossen haben, können Sie das Quellverzeichnis öffnen und Code hinzufügen, wie in den folgenden Abschnitten beschrieben. Für dieses Beispiel müssen in Ihrem Projekt die Module Cloud Functions und Admin SDK mit Node-require-Anweisungen importiert werden. Fügen Sie Ihrer index.js-Datei Zeilen wie die folgenden hinzu:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

In diesen Zeilen werden die Module firebase-functions und firebase-admin geladen und eine admin-App-Instanz initialisiert, über die Cloud Firestore-Änderungen vorgenommen werden können. Wo immer Admin SDK-Unterstützung verfügbar ist, wie für FCM, Authentication und Firebase Realtime Database, bietet es eine leistungsstarke Möglichkeit, Firebase mit Cloud Functions zu integrieren.

Bei der Initialisierung Ihres Projekts werden mit der Firebase-CLI automatisch die Firebase- und Firebase-SDK für Cloud Functions-Node-Module installiert. Wenn Sie Ihrem Projekt Drittanbieterbibliotheken hinzufügen möchten, können Sie package.json ändern und npm install ausführen. Weitere Informationen finden Sie unter Abhängigkeiten verarbeiten.

Funktion addMessage() hinzufügen

Fügen Sie für die Funktion addMessage() diese Zeilen zu index.js hinzu:

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

Die Funktion addMessage() ist ein HTTP-Endpunkt. Jede Anfrage an den Endpunkt führt dazu, dass Request- und Response-Objekte im ExpressJS-Stil an den onRequest()-Callback übergeben werden.

HTTP-Funktionen sind synchron (ähnlich wie aufrufbare Funktionen). Sie sollten daher so schnell wie möglich eine Antwort senden und die Arbeit mit Cloud Firestore aufschieben. Die HTTP-Funktion addMessage() übergibt einen Textwert an den HTTP-Endpunkt und fügt ihn unter dem Pfad /messages/:documentId/original in die Datenbank ein.

Funktion makeUppercase() hinzufügen

Fügen Sie für die Funktion makeUppercase() diese Zeilen zu index.js hinzu:

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

Die Funktion makeUppercase() wird ausgeführt, wenn in Cloud Firestore geschrieben wird. Die Funktion ref.set definiert das Dokument, das überwacht werden soll. Aus Leistungsgründen sollten Sie so konkret wie möglich sein.

Geschweifte Klammern, z. B. {documentId}, umschließen „Parameter“, also Platzhalter, die die entsprechenden Daten im Callback verfügbar machen.

Cloud Firestore löst den Callback onCreate() aus, wenn neue Nachrichten hinzugefügt werden.

Ereignisgesteuerte Funktionen wie Cloud Firestore-Ereignisse sind asynchron. Die Callback-Funktion sollte entweder ein null, ein Objekt oder ein Promise zurückgeben. Wenn Sie nichts zurückgeben, tritt für die Funktion ein Zeitüberschreitungsfehler auf und sie wird noch einmal ausgeführt. Weitere Informationen finden Sie unter Sync, Async, and Promises.

Ausführung von Funktionen emulieren

Mit dem Firebase Local Emulator Suite können Sie Apps auf Ihrem lokalen Computer erstellen und testen, anstatt sie in einem Firebase-Projekt bereitzustellen. Lokale Tests während der Entwicklung werden dringend empfohlen, da sie unter anderem das Risiko von Programmierfehlern verringern, die in einer Produktionsumgebung möglicherweise Kosten verursachen könnten (z. B. eine Endlosschleife).

So emulieren Sie Ihre Funktionen:

  1. Führen Sie firebase emulators:start aus und suchen Sie in der Ausgabe nach der URL von Emulator Suite UI. Standardmäßig wird localhost:4000 verwendet, aber möglicherweise wird auf Ihrem Computer ein anderer Port verwendet. Geben Sie diese URL in Ihren Browser ein, um die Emulator Suite UI zu öffnen.

  2. Prüfen Sie die Ausgabe des Befehls firebase emulators:start auf die URL der HTTP-Funktion addMessage(). Sie sieht ähnlich aus wie http://localhost:5001/MY_PROJECT/us-central1/addMessage, mit folgenden Unterschieden:

    1. MY_PROJECT wird durch Ihre Projekt-ID ersetzt.
    2. Der Port kann auf Ihrem lokalen Computer abweichen.
  3. Fügen Sie den Abfragestring ?text=uppercaseme am Ende der URL der Funktion hinzu. Das sollte in etwa so aussehen: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme. Optional können Sie die Nachricht „uppercaseme“ in eine benutzerdefinierte Nachricht ändern.

  4. Erstellen Sie eine neue Mitteilung, indem Sie die URL in einem neuen Tab in Ihrem Browser öffnen.

  5. Sehen Sie sich die Auswirkungen der Funktionen in Emulator Suite UI an:

    1. Auf dem Tab Logs sollten neue Logs angezeigt werden, die darauf hinweisen, dass die Funktionen addMessage() und makeUppercase() ausgeführt wurden:

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. Auf dem Tab Firestore sollte ein Dokument mit Ihrer ursprünglichen Nachricht und der in Großbuchstaben geschriebenen Version Ihrer Nachricht angezeigt werden. Wenn die ursprüngliche Nachricht „uppercaseme“ lautete, sehen Sie „UPPERCASEME“.

Funktionen in einer Produktionsumgebung bereitstellen

Sobald Ihre Funktionen im Emulator wie gewünscht funktionieren, können Sie sie in der Produktionsumgebung bereitstellen, testen und ausführen. Beachten Sie, dass für die Bereitstellung in der Node.js 14-Laufzeitumgebung für Ihr Projekt der Blaze-Tarif erforderlich ist. Cloud Functions-Preise

Um die Anleitung abzuschließen, stellen Sie Ihre Funktionen bereit und führen Sie dann addMessage() aus, um makeUppercase() auszulösen.

  1. Führen Sie diesen Befehl aus, um Ihre Funktionen bereitzustellen:

     firebase deploy --only functions
     

    Nachdem Sie diesen Befehl ausgeführt haben, gibt die Firebase-CLI die URL für alle HTTP-Funktionsendpunkte aus. Im Terminal sollte eine Zeile wie die folgende angezeigt werden:

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

    Die URL enthält Ihre Projekt-ID sowie eine Region für die HTTP-Funktion. Sie müssen sich jetzt noch keine Gedanken darüber machen, aber für einige HTTP-Funktionen in der Produktion sollte ein location angegeben werden, um die Netzwerklatenz zu minimieren.

    Wenn Sie auf Zugriffsfehler wie „Zugriff auf Projekt kann nicht autorisiert werden“ stoßen, überprüfen Sie die Projektaliasse.

  2. Fügen Sie der von der CLI ausgegebenen addMessage()-URL einen Textabfrageparameter hinzu und öffnen Sie sie in einem Browser:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    Die Funktion wird ausgeführt und der Browser wird zur Firebase-Konsole am Datenbankstandort weitergeleitet, an dem der Textstring gespeichert ist. Dieses Schreibereignis löst makeUppercase() aus, wodurch eine Version des Strings in Großbuchstaben geschrieben wird.

Nachdem Sie Funktionen bereitgestellt und ausgeführt haben, können Sie sich die Logs in der Google Cloud-Konsole ansehen. Wenn Sie Funktionen in der Entwicklung oder Produktion löschen müssen, verwenden Sie die Firebase-CLI.

In der Produktion sollten Sie die Funktionsleistung optimieren und die Kosten kontrollieren, indem Sie eine Mindest- und eine Höchstanzahl von Instanzen für die Ausführung festlegen. Weitere Informationen zu diesen Laufzeitoptionen finden Sie unter Skalierungsverhalten steuern.

Vollständigen Beispielcode ansehen

Hier ist die vollständige functions/index.js mit den Funktionen addMessage() und makeUppercase(). Mit diesen Funktionen können Sie einen Parameter an einen HTTP-Endpunkt übergeben, der einen Wert in Cloud Firestore schreibt und ihn dann transformiert, indem alle Zeichen im String in Großbuchstaben umgewandelt werden.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

Nächste Schritte

In dieser Dokumentation erfahren Sie mehr darüber, wie Sie Funktionen für Cloud Functions verwalten und wie Sie alle von Cloud Functions unterstützten Ereignistypen verarbeiten.

Weitere Informationen zu Cloud Functions finden Sie auch hier: