Chciałbym stworzyć wiele funkcji Cloud Functions dla Firebase i wdrożyć je wszystkie w tym samym czasie z jednego projektu. Chciałbym też oddzielić każdą funkcję w osobnym pliku. Obecnie mogę tworzyć wiele funkcji, jeśli umieszczę je obie w pliku index.js, na przykład:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Chciałbym jednak umieścić foo i bar w osobnych plikach. Próbowałem tego:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
gdzie jest foo.js
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
a bar.js jest
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Czy istnieje sposób na osiągnięcie tego bez umieszczania wszystkich funkcji w pliku index.js?
javascript
firebase
google-cloud-functions
jasonsirota
źródło
źródło
.js
plików zaimportowanych przezrequire
: github.com/firebase/functions-samples/tree/master/…Odpowiedzi:
Ach, Cloud Functions for Firebase normalnie ładuje moduły węzłów, więc to działa
Struktura:
index.js:
foo.js:
bar.js:
źródło
Odpowiedź @jasonsirota była bardzo pomocna. Ale może być przydatne wyświetlenie bardziej szczegółowego kodu, szczególnie w przypadku funkcji wyzwalanych przez HTTP.
Używając tej samej struktury, co w odpowiedzi @ jasonsirota, powiedzmy, że chcesz mieć dwie oddzielne funkcje wyzwalające HTTP w dwóch różnych plikach:
struktura katalogów:
index.js:
foo.js:
bar.js:
źródło
Aktualizacja: ten dokument powinien pomóc , moja odpowiedź jest starsza niż ten dokument.
Oto, jak osobiście to zrobiłem z maszynopisem:
Pozwólcie, że poprzedzę to dwoma ostrzeżeniami, aby to zadziałało:
Jeśli chodzi o punkt numer 2, nie jestem pewien, dlaczego. Secundo, powinieneś dokładnie uszanować moją konfigurację index, main i db (przynajmniej żeby ją wypróbować).
index.ts : zajmuje się eksportem. Uważam, że lepiej jest pozwolić plikowi index.ts na eksport.
main.ts : zajmuje się inicjalizacją.
db.ts : po prostu ponownie eksportuję bazę danych, aby jej nazwa była krótsza niż
database()
http-functions.ts
źródło
db.ts
wejść do środkamain.ts
(po wystąpieniu administratora?). A może właśnie podzieliłeś się w ten sposób dla jasności / prostoty?Dzięki Node 8 LTS, który jest teraz dostępny z Cloud / Firebase Functions, możesz wykonywać następujące czynności za pomocą operatorów rozproszenia:
/package.json
/index.js
/lib/foo.js
źródło
unexpected token ...
wewnątrz index.js.Aby zachować prostotę (ale działa), osobiście ustrukturyzowałem swój kod w ten sposób.
Układ
foo.ts
bar.ts
db.ts
index.ts
Działa dla katalogów na dowolnych zagnieżdżonych poziomach. Po prostu postępuj zgodnie ze wzorcem wewnątrz katalogów.
źródło
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Gdzie to umieścisz i jak się do tego odnosisz w foo i bar?db.ts
wejść do środkaindex.ts
(po wystąpieniu administratora?). A może właśnie podzieliłeś się w ten sposób dla jasności / prostoty?W przypadku Babel / Flow wyglądałoby to tak:
Układ katalogów
src/index.js
- Główne produkty eksportowesrc/db.js
- Klient Cloud SQL dla Postgressrc/store.js
- Klient Firebase Firestoresrc/someFuncA.js
- Funkcja Asrc/someFuncB.js
- Funkcja B.babelrc
firebase.json
package.json
źródło
Zarys bigcodenerd.org to prostszy wzorzec architektury, w którym metody są rozdzielane na różne pliki i eksportowane w jednym wierszu w pliku index.js .
Architektura projektu w tym przykładzie jest następująca:
projectDirectory
index.js
podcast.js
Ten sam wzorzec zostałby użyty dla
removeProfile
metody w pliku profilu .źródło
Aby zachować prostotę (ale działa), osobiście ustrukturyzowałem swój kod w ten sposób.
Układ
foo.ts
bar.ts
index.ts
Działa dla katalogów na dowolnych zagnieżdżonych poziomach. Po prostu postępuj zgodnie ze wzorcem wewnątrz katalogów.
źródło
export * from './fooFunctions';
iexport * from './barFunctions';
w index.ts?Ten format umożliwia punktowi wejścia automatyczne wyszukiwanie dodatkowych plików funkcji i eksportowanie każdej funkcji w każdym pliku.
Skrypt głównego punktu wejścia
Znajduje wszystkie pliki .js w folderze funkcji i eksportuje każdą funkcję wyeksportowaną z każdego pliku.
Przykład eksportu wielu funkcji z jednego pliku
Dostępne punkty końcowe http są odpowiednio nazwane
Jeden plik
Jeśli masz tylko kilka dodatkowych plików (np. Tylko jeden), możesz użyć:
źródło
Mam więc ten projekt, który ma funkcje w tle i funkcje http. Mam też testy do testów jednostkowych. CI / CD znacznie ułatwi Ci życie podczas wdrażania funkcji chmury
Struktura folderów
Uwaga:
utils/
folder służy do udostępniania kodu między funkcjamifunctions / index.js
Tutaj możesz po prostu zaimportować wszystkie potrzebne funkcje i zadeklarować je. Nie ma potrzeby mieć tutaj logiki. Moim zdaniem sprawia, że jest czystszy.
CI / CD
A co z ciągłą integracją i wdrażaniem za każdym razem, gdy wprowadzasz zmiany do repozytorium? Możesz to mieć, używając google google cloud build . Do pewnego momentu za darmo :) Sprawdź ten link .
./cloudbuild.yaml
źródło
Istnieje całkiem dobry sposób na długoterminową organizację wszystkich funkcji chmury. Zrobiłem to niedawno i działa bez zarzutu.
To, co zrobiłem, to zorganizowanie każdej funkcji chmury w oddzielnych folderach na podstawie ich punktu końcowego wyzwalacza. Każda nazwa pliku funkcji chmury kończy się na
*.f.js
. Na przykład, jeśli masz włączoneonCreate
ionUpdate
wyzwalacze,user/{userId}/document/{documentId}
utwórz dwa plikionCreate.f.js
ionUpdate.f.js
w katalogu,functions/user/document/
a twoja funkcja zostanie odpowiednio nazwanauserDocumentOnCreate
iuserDocumentOnUpdate
. (1)Oto przykładowa struktura katalogu:
Przykładowa funkcja
Index.js
(1): Możesz użyć dowolnej nazwy. Dla mnie onCreate.f.js, onUpdate.f.js itp. Wydają się bardziej odpowiednie do rodzaju wyzwalacza, którym są.
źródło
*.f.js
pliku. Najmniej można zrobić jest zmiana nazwy pliku dla każdej wersji przez poprzedzenie sufiks aby coś*.v1.f.js
lub*.v2.f.js
itd. (Zakładając, że wszystkie wersje wszystkich swoich http spuście są pod napięciem). Daj mi znać, jeśli masz lepsze rozwiązanie.Używam programu ładującego vanilla JS do automatycznego dołączania wszystkich funkcji, których chcę używać.
index.js (program ładujący)
Ten przykładowy plik index.js zawiera automatycznie tylko katalogi w katalogu głównym. Można go rozszerzyć o chodzenie po katalogach, honorowanie .gitignore, itp. To mi jednak wystarczyło.
Po utworzeniu pliku indeksu dodawanie nowych funkcji jest banalne.
/test/testA.js
/test/testB.js
npm run serve
plony:Ten przepływ pracy jest po prostu „zapisuj i uruchamiaj”, bez konieczności modyfikowania pliku index.js za każdym razem, gdy nowa funkcja / plik jest dodawany / modyfikowany / usuwany.
źródło
Oto prosta odpowiedź, jeśli tworzysz funkcje chmury za pomocą maszynopisu.
W przypadku prawie wszystkich zwykłych importów u góry wyeksportuj wszystkie funkcje z
foo.ts
.export * from './foo';
źródło
Spędziłem dużo czasu szukając tego samego i jest to, co moim zdaniem jest najlepszym sposobem na osiągnięcie tego (używam [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Bez potu;)
źródło