Saya ingin membuat beberapa Fungsi Cloud untuk Firebase dan menyebarkan semuanya sekaligus pada satu proyek. Saya juga ingin memisahkan setiap fungsi menjadi file yang terpisah. Saat ini saya dapat membuat beberapa fungsi jika saya menempatkan keduanya di index.js seperti:
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Namun saya ingin meletakkan foo dan bar di file terpisah. Saya mencoba ini:
/functions
|--index.js (blank)
|--foo.js
|--bar.js
|--package.json
dimana foo.js berada
exports.foo = functions.database.ref('/foo').onWrite(event => {
...
});
dan bar.js adalah
exports.bar = functions.database.ref('/bar').onWrite(event => {
...
});
Apakah ada cara untuk mencapai ini tanpa meletakkan semua fungsi di index.js?
javascript
firebase
google-cloud-functions
jasonirota
sumber
sumber
.js
file yang diimpor melaluirequire
: github.com/firebase/functions-samples/tree/master/…Jawaban:
Ah, Cloud Functions untuk Firebase memuat modul simpul secara normal, jadi ini berfungsi
struktur:
index.js:
foo.js:
bar.js:
sumber
Jawaban oleh @jasonirota sangat membantu. Tetapi mungkin bermanfaat untuk melihat kode yang lebih rinci, terutama dalam hal fungsi yang dipicu HTTP.
Menggunakan struktur yang sama seperti pada jawaban @ jasonirota, katakanlah Anda ingin memiliki dua fungsi pemicu HTTP terpisah dalam dua file berbeda:
struktur direktori:
index.js:
foo.js:
bar.js:
sumber
Pembaruan: Doc ini seharusnya membantu , jawaban saya lebih tua dari pada doc ini.
Inilah cara saya melakukannya secara pribadi dengan naskah:
Izinkan saya mengawali ini dengan memberikan dua peringatan untuk membuat ini bekerja:
Untuk poin nomor 2, saya tidak yakin mengapa. Secundo Anda harus menghormati konfigurasi indeks saya, utama dan db persis (setidaknya untuk mencobanya).
index.ts : berkaitan dengan ekspor. Saya merasa lebih bersih untuk membiarkan index.ts berurusan dengan ekspor.
main.ts : Berurusan dengan inisialisasi.
db.ts : hanya mengekspor ulang db sehingga namanya lebih pendek dari
database()
http-functions.ts
sumber
db.ts
masukmain.ts
(setelah instantiasi admin?). Atau apakah Anda baru saja memisahkan diri dengan cara ini untuk kejelasan / kesederhanaan?Dengan Node 8 LTS sekarang tersedia dengan Cloud / Firebase Functions, Anda dapat melakukan hal berikut dengan operator yang tersebar:
/package.json
/index.js
/lib/foo.js
sumber
unexpected token ...
di dalam index.js.Agar tetap sederhana (tetapi berfungsi), saya secara pribadi menyusun kode saya seperti ini.
Tata letak
untuk
bar.ts
db.ts
index.ts
Berfungsi untuk direktori dari semua level bersarang. Cukup ikuti pola di dalam direktori juga.
sumber
admin.initializeApp(functions.config().firestore) const db = admin.firestore();
Di mana Anda meletakkan ini dan bagaimana Anda merujuknya di foo and bar?db.ts
masukindex.ts
(setelah instantiasi admin?). Atau apakah Anda baru saja memisahkan diri dengan cara ini untuk kejelasan / kesederhanaan?Dalam hal Babel / Flow akan terlihat seperti ini:
Tata Letak Direktori
src/index.js
- Ekspor utamasrc/db.js
- Cloud SQL Client untuk Postgressrc/store.js
- Firebase Firestore Clientsrc/someFuncA.js
- Fungsi Asrc/someFuncB.js
- Fungsi B.babelrc
firebase.json
package.json
sumber
bigcodenerd.org menguraikan pola arsitektur yang lebih sederhana untuk memisahkan metode menjadi file yang berbeda dan diekspor dalam satu baris dalam file index.js .
Arsitektur untuk proyek dalam sampel ini adalah sebagai berikut:
projectDirectory
index.js
podcast.js
Pola yang sama akan digunakan untuk
removeProfile
metode dalam file profil .sumber
Agar tetap sederhana (tetapi berfungsi), saya secara pribadi menyusun kode saya seperti ini.
Tata letak
untuk
bar.ts
index.ts
Berfungsi untuk direktori dari semua level bersarang. Cukup ikuti pola di dalam direktori juga.
sumber
export * from './fooFunctions';
danexport * from './barFunctions';
di index.ts?Format ini memungkinkan titik masuk Anda untuk menemukan file fungsi tambahan, dan mengekspor setiap fungsi dalam setiap file, secara otomatis.
Script Titik Masuk Utama
Menemukan semua file .js di dalam folder fungsi, dan mengekspor setiap fungsi yang diekspor dari setiap file.
Contoh Ekspor Beberapa Fungsi dari Satu File
Titik akhir yang dapat diakses http diberi nama dengan tepat
Satu file
Jika Anda hanya memiliki beberapa file tambahan (mis. Hanya satu), Anda dapat menggunakan:
sumber
Jadi saya punya proyek ini yang memiliki fungsi latar belakang dan fungsi http. Saya juga memiliki tes untuk pengujian unit. CI / CD akan membuat hidup Anda lebih mudah ketika menggunakan fungsi cloud
Struktur folder
Catatan:
utils/
folder adalah untuk berbagi kode antar fungsifungsi / index.js
Di sini Anda bisa mengimpor semua fungsi yang Anda butuhkan dan mendeklarasikannya. Tidak perlu punya logika di sini. Itu membuatnya lebih bersih menurut saya.
CI / CD
Bagaimana dengan memiliki integrasi dan penerapan berkelanjutan setiap kali Anda mendorong perubahan ke repo? Anda dapat memilikinya dengan menggunakan google google cloud build . Gratis sampai titik tertentu :) Periksa tautan ini .
./cloudbuild.yaml
sumber
Ada cara yang cukup bagus untuk mengatur semua fungsi cloud Anda untuk jangka panjang. Saya melakukan ini baru-baru ini dan bekerja dengan sempurna.
Apa yang saya lakukan adalah mengatur setiap fungsi cloud dalam folder terpisah berdasarkan titik akhir pemicu mereka. Setiap nama fungsi cloud diakhiri dengan
*.f.js
. Misalnya, jika Anda memilikionCreate
danonUpdate
memicuuser/{userId}/document/{documentId}
maka buat dua fileonCreate.f.js
danonUpdate.f.js
dalam direktorifunctions/user/document/
dan fungsi Anda akan dinamaiuserDocumentOnCreate
danuserDocumentOnUpdate
masing - masing. (1)Berikut adalah contoh struktur direktori:
Fungsi Sampel
Index.js
(1): Anda dapat menggunakan nama yang Anda inginkan. Bagi saya, onCreate.f.js, onUpdate.f.js dll. Tampaknya lebih relevan dengan jenis pemicu mereka.
sumber
*.f.js
file sendiri . Paling tidak yang bisa Anda lakukan adalah mengganti nama file untuk setiap versi dengan menambahkan akhiran untuk membuatnya seperti*.v1.f.js
atau*.v2.f.js
lain - lain (Asumsikan semua versi Anda dari semua pemicu http Anda aktif). Tolong beri tahu saya jika Anda memiliki solusi yang lebih baik.Saya menggunakan bootloader vanilla JS untuk secara otomatis menyertakan semua fungsi yang ingin saya gunakan.
index.js (bootloader)
File index.js contoh ini hanya menyertakan direktori secara otomatis di dalam root. Itu bisa diperluas untuk berjalan direktori, kehormatan .gitignore, dll. Ini sudah cukup bagi saya.
Dengan file indeks di tempat, menambahkan fungsi baru itu sepele.
/test/testA.js
/test/testB.js
npm run serve
hasil:Alur kerja ini cukup banyak hanya "tulis dan jalankan", tanpa harus memodifikasi file index.js setiap kali fungsi / file baru ditambahkan / dimodifikasi / dihapus.
sumber
Inilah jawaban sederhana jika Anda membuat fungsi cloud dengan naskah.
Di dekat semua impor reguler Anda di bagian atas, cukup ekspor semua fungsi dari
foo.ts
.export * from './foo';
sumber
Saya menghabiskan banyak waktu mencari hal yang sama, dan ada apa yang saya pikir adalah cara terbaik untuk mencapainya (saya menggunakan [email protected]):
https://codeburst.io/organizing-your-firebase-cloud-functions-67dc17b3b0da
Tanpa keringat;)
sumber