Fungsi Firestore onUpdate tidak memicu

Jan 02 2021

Masalah

Saya menggunakan fungsi cloud Firebase dengan emulator, dan untuk beberapa alasan, onUpdatepemicunya tidak terpicu, namun onCreatefungsinya 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 addfungsi 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, onUpdatefungsinya 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

Nick Jan 04 2021 at 03:15

Ternyata saya lupa mengimpor onMusicUpdateddi 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'