Ich möchte mehrere Cloud-Funktionen für Firebase erstellen und alle gleichzeitig aus einem Projekt bereitstellen. Ich möchte auch jede Funktion in eine separate Datei trennen. Derzeit kann ich mehrere Funktionen erstellen, wenn ich beide in index.js einfüge, z.
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Ich möchte jedoch foo und bar in getrennten Dateien ablegen. Ich habe es versucht:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
wo foo.js ist
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
und bar.js ist
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Gibt es eine Möglichkeit, dies zu erreichen, ohne alle Funktionen in index.js zu platzieren?
javascript
firebase
google-cloud-functions
jasonsirota
quelle
quelle
.js
require
Antworten:
Ah, Cloud-Funktionen für Firebase-Ladeknotenmodule normalerweise, also funktioniert dies
Struktur:
index.js:
foo.js:
bar.js:
quelle
Die Antwort von @jasonsirota war sehr hilfreich. Es kann jedoch nützlich sein, detaillierteren Code anzuzeigen, insbesondere bei durch HTTP ausgelösten Funktionen.
Angenommen, Sie möchten dieselbe Struktur wie in der Antwort von @ jasonsirota verwenden und möchten zwei separate HTTP-Triggerfunktionen in zwei verschiedenen Dateien haben:
Verzeichnisaufbau:
index.js:
foo.js:
bar.js:
quelle
Update: Dieses Dokument sollte helfen , meine Antwort ist älter als dieses Dokument.
So habe ich es persönlich mit Typoskript gemacht:
Lassen Sie mich dies vorwegnehmen, indem Sie zwei Warnungen geben, damit dies funktioniert:
Für Punkt 2 bin ich mir nicht sicher warum. Secundo sollten Sie meine Konfiguration von Index, Main und DB genau respektieren (zumindest um es auszuprobieren).
index.ts : befasst sich mit dem Export. Ich finde es sauberer, wenn index.ts sich mit Exporten befasst.
main.ts : Beschäftigt sich mit der Initialisierung.
db.ts : Exportiert die Datenbank nur erneut, sodass ihr Name kürzer als ist
database()
http-functions.ts
quelle
db.ts
nicht nach innen gehenmain.ts
(nach der Instanziierung durch den Administrator?). Oder haben Sie sich aus Gründen der Klarheit / Einfachheit einfach auf diese Weise aufgeteilt?Mit Node 8 LTS, das jetzt mit Cloud / Firebase-Funktionen verfügbar ist, können Sie mit Spread-Operatoren Folgendes tun:
/package.json
/index.js
/lib/foo.js
quelle
unexpected token ...
in index.js.Um einfach zu bleiben (aber die Arbeit erledigt), habe ich meinen Code persönlich so strukturiert.
Layout
foo.ts
bar.ts
db.ts.
index.ts
Funktioniert für Verzeichnisse verschachtelter Ebenen. Folgen Sie einfach auch dem Muster in den Verzeichnissen.
quelle
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Wo setzen Sie das ein und wie beziehen Sie sich in foo und bar darauf?db.ts
nicht hineingehenindex.ts
(nach der Instanziierung durch den Administrator?). Oder haben Sie sich aus Gründen der Klarheit / Einfachheit einfach auf diese Weise aufgeteilt?Im Fall von Babel / Flow würde es so aussehen:
Verzeichnislayout
src/index.js
- Hauptexportgüter)src/db.js
- Cloud SQL Client für Postgressrc/store.js
- Firebase Firestore Clientsrc/someFuncA.js
- Funktion A.src/someFuncB.js
- Funktion B..babelrc
firebase.json
package.json
quelle
Die Gliederung von bigcodenerd.org ist ein einfacheres Architekturmuster, damit Methoden in verschiedene Dateien getrennt und in einer Zeile innerhalb der Datei index.js exportiert werden.
Die Architektur für das Projekt in diesem Beispiel lautet wie folgt:
projectDirectory
index.js
podcast.js
Das gleiche Muster würde für die
removeProfile
Methode in der Profildatei verwendet.quelle
Um einfach zu bleiben (aber die Arbeit erledigt), habe ich meinen Code persönlich so strukturiert.
Layout
foo.ts
bar.ts
index.ts
Funktioniert für Verzeichnisse verschachtelter Ebenen. Folgen Sie einfach auch dem Muster in den Verzeichnissen.
quelle
export * from './fooFunctions';
undexport * from './barFunctions';
in index.ts haben, anstatt mit Spread-Operatoren zu importieren und erneut zu exportieren ?Dieses Format ermöglicht es Ihrem Einstiegspunkt, zusätzliche Funktionsdateien zu finden und jede Funktion innerhalb jeder Datei automatisch zu exportieren.
Haupteinstiegspunkt-Skript
Findet alle .js-Dateien im Funktionsordner und exportiert jede aus jeder Datei exportierte Funktion.
Beispiel Export mehrerer Funktionen aus einer Datei
Auf http zugängliche Endpunkte werden entsprechend benannt
Eine Datei
Wenn Sie nur wenige zusätzliche Dateien haben (z. B. nur eine), können Sie Folgendes verwenden:
quelle
Ich habe also dieses Projekt, das Hintergrundfunktionen und http-Funktionen hat. Ich habe auch Tests für Unit-Tests. CI / CD erleichtert Ihnen das Leben bei der Bereitstellung von Cloud-Funktionen erheblich
Ordnerstruktur
Hinweis: Der
utils/
Ordner dient zum Freigeben von Code zwischen FunktionenFunktionen / index.js
Hier können Sie einfach alle benötigten Funktionen importieren und deklarieren. Hier muss keine Logik vorhanden sein. Es macht es meiner Meinung nach sauberer.
CI / CD
Wie wäre es mit einer kontinuierlichen Integration und Bereitstellung jedes Mal, wenn Sie Ihre Änderungen in das Repo übertragen? Sie können es mit Google Google Cloud Build haben . Es ist bis zu einem bestimmten Punkt kostenlos :) Überprüfen Sie diesen Link .
./cloudbuild.yaml
quelle
Es gibt eine ziemlich gute Möglichkeit, alle Ihre Cloud-Funktionen langfristig zu organisieren. Ich habe das kürzlich gemacht und es funktioniert einwandfrei.
Ich habe jede Cloud-Funktion in separaten Ordnern basierend auf ihrem Trigger-Endpunkt organisiert. Jeder Dateiname der Cloud-Funktion endet mit
*.f.js
. Zum Beispiel, wenn Sie hatonCreate
undonUpdate
Trigger füruser/{userId}/document/{documentId}
erstellen Sie dann zwei DateienonCreate.f.js
undonUpdate.f.js
im Verzeichnisfunctions/user/document/
und Ihre Funktion wird benannt werdenuserDocumentOnCreate
unduserDocumentOnUpdate
jeweils. (1)Hier ist ein Beispiel für eine Verzeichnisstruktur:
Beispielfunktion
Index.js
(1): Sie können einen beliebigen Namen verwenden. Für mich scheinen onCreate.f.js, onUpdate.f.js usw. für die Art des Auslösers relevanter zu sein.
quelle
*.f.js
Datei befindet. Das Mindeste , was Sie tun können , ist die Datei für jede Version durch Voranstellung des Suffix es so etwas wie zu machen das Umbenennen*.v1.f.js
oder*.v2.f.js
usw. (Vorausgesetzt , alle Versionen aller Ihrer http Trigger sind live). Bitte lassen Sie mich wissen, wenn Sie eine bessere Lösung haben.Ich verwende einen Vanilla JS-Bootloader, um alle Funktionen, die ich verwenden möchte, automatisch einzuschließen.
index.js (Bootloader)
Diese Beispieldatei index.js enthält nur automatisch Verzeichnisse im Stammverzeichnis. Es könnte erweitert werden, um Verzeichnisse zu führen, .gitignore zu ehren usw. Dies war jedoch genug für mich.
Wenn die Indexdatei vorhanden ist, ist das Hinzufügen neuer Funktionen trivial.
/test/testA.js
/test/testB.js
npm run serve
Ausbeuten:Dieser Workflow ist so ziemlich nur "Schreiben und Ausführen", ohne dass die Datei index.js jedes Mal geändert werden muss, wenn eine neue Funktion / Datei hinzugefügt / geändert / entfernt wird.
quelle
Hier ist eine einfache Antwort, wenn Sie Cloud-Funktionen mit Typoskript erstellen.
Nahezu alle Ihre regulären Importe oben exportieren Sie einfach alle Funktionen von
foo.ts
.export * from './foo';
quelle
Ich habe viel Zeit damit verbracht, nach dem gleichen zu suchen, und es gibt meiner Meinung nach den besten Weg, dies zu erreichen (ich verwende [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Kein Schweiß ;)
quelle