Fungsi Firestore onUpdate tidak memicu
Masalah
Saya menggunakan fungsi cloud Firebase dengan emulator, dan untuk beberapa alasan, onUpdate
pemicunya tidak terpicu, namun onCreate
fungsinya memang memicu.
Semua kode adalah TypeScript, dan ditranspilasi ke JS untuk bekerja pada fungsi cloud.
// functions/src/music.ts
// this function runs
export const onMusicCreated = functions.firestore
.document('music/{musicId}')
.onCreate(async (snapshot) => {
console.log('on create is running')
})
// this function doesn't run
export const onMusicUpdated = functions.firestore
.document('music/{musicId}')
.onUpdate(async (change) => {
console.log('on update is running')
})
Kedua fungsi tersebut async karena di kode terakhir,
Di front-end, saat saya menjalankan add
fungsi di front-end, fungsi tersebut akan aktif onCreate
.
const { id } = await firebase.firestore().collection('music').add({ title: 'hello world' })
Log konsol berjalan seperti yang diharapkan dan emulator mengeluarkannya ke konsol:
i functions: Beginning execution of "onMusicCreated"
i functions: Finished "onMusicCreated" in ~1s
Namun ketika saya memperbarui dokumen yang sama, onUpdate
fungsinya tidak berjalan.
// "id" is the same id as above
await firebase.firestore().doc(`music/${id}`).update({ title: 'new title' })
Tidak ada yang terjadi. Saya dapat mengonfirmasi bahwa dokumen tersebut benar-benar diperbarui ketika saya melihat di emulator firestore. Apakah saya melewatkan sesuatu yang jelas? Kode front-end disederhanakan dibandingkan dengan penggunaan aktual saya, tetapi kode fungsi tidak disederhanakan sama sekali. Dan saya dapat mengonfirmasi bahwa dokumen firestore dibuat dan diperbarui seperti yang saya harapkan.
Tidak ada pesan kesalahan di konsol atau log.
Langkah debug
- Saya telah memeriksa untuk memastikan kode fungsi ditranspilasi dengan benar ke JS. Saya sama-sama melihat keluaran kode, serta memperbarui kode onCreate beberapa kali untuk memastikan bahwa fungsi diperbarui
- Saya mengosongkan semua kode saya di dalam fungsi (seperti yang ditunjukkan di atas), jadi saya dapat mengonfirmasi bahwa fungsinya sendiri tidak berjalan
- Fungsi onUpdate secara teknis menerima dua parameter. Hasil yang sama dengan kedua parameter tersebut.
- Saya belum mencoba fungsi dalam produksi, hanya dengan emulator.
Posting terkait
Mengapa pemicu onWrite firestore tidak dipanggil pada emulator fungsi cloud firebase?
Saya tidak menggunakan karakter terlarang di pemilih dokumen, atau setidaknya saya tidak mendapatkan pesan kesalahan itu.
Firebase Cloud Functions for Firestore tidak memicu
Menggunakan fungsi 3.11.0, dan fungsinya asinkron, oleh karena itu keduanya harus mengembalikan Promise secara implisit. Hasilnya sama ketika secara eksplisit mengembalikan nilai (mis., return 0
)
https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated
Itu dokumen resminya. Sejauh yang saya tahu, saya melakukan apa yang dikatakan oleh dokumen. Aku bisa saja melewatkan sesuatu yang sangat jelas.
Detail lainnya
- macOS Big Sur 11.1 (20C69)
- Firebase CLI 9.1.0
Emulator harus up-to-date
Ada ide? Terima kasih!
Jawaban
Ternyata saya lupa mengimpor onMusicUpdated
di file fungsi index.ts. Karenanya emulator tidak pernah tahu itu ada!
Berubah
// functions/src/index.ts
export { onMusicCreated } from './music'
untuk
// functions/src/index.ts
export { onMusicCreated, onMusicUpdated } from './music'