Firestore onUpdate-Funktion wird nicht ausgelöst

Jan 02 2021

Das Problem

Ich verwende Firebase-Cloud-Funktionen mit dem Emulator, und aus irgendeinem Grund wird der onUpdateTrigger nicht ausgelöst, die onCreateFunktion wird jedoch ausgelöst.

Der gesamte Code ist TypeScript und wird in JS transpiliert, um an Cloud-Funktionen zu arbeiten.

// 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')
    })

Beide Funktionen sind asynchron, da im endgültigen Code

Wenn ich addim Frontend die Funktion im Frontend ausführe , wird die onCreateFunktion ausgelöst.

const { id } = await firebase.firestore().collection('music').add({ title: 'hello world' })

Das Konsolenprotokoll wird wie erwartet ausgeführt und der Emulator gibt dies an die Konsole aus:

i  functions: Beginning execution of "onMusicCreated"
i  functions: Finished "onMusicCreated" in ~1s

Wenn ich jedoch dasselbe Dokument aktualisiere, wird die onUpdateFunktion nicht ausgeführt.

// "id" is the same id as above
await firebase.firestore().doc(`music/${id}`).update({ title: 'new title' })

Nichts passiert. Ich kann bestätigen, dass das Dokument tatsächlich aktualisiert wurde, wenn ich in den Firestore-Emulator schaue. Vermisse ich etwas Offensichtliches? Der Front-End-Code ist im Vergleich zu meiner tatsächlichen Verwendung vereinfacht, aber der Funktionscode ist überhaupt nicht vereinfacht. Und ich kann bestätigen, dass das Firestore-Dokument wie erwartet erstellt und aktualisiert wurde.

Keine Fehlermeldungen in der Konsole oder den Protokollen.

Debug-Schritte

  • Ich habe überprüft, ob der Funktionscode korrekt in JS übertragen wurde. Ich habe mir beide die Code-Ausgabe angesehen und den onCreate-Code mehrmals aktualisiert, um sicherzustellen, dass diese Funktion aktualisiert wurde
  • Ich habe meinen gesamten Code in den Funktionen ausgehöhlt (wie oben gezeigt), damit ich bestätigen kann, dass die Funktion selbst nicht ausgeführt wird
  • Die Funktion onUpdate akzeptiert technisch zwei Parameter. Gleiche Ergebnisse mit beiden Parametern.
  • Ich habe die Funktionen in der Produktion nicht ausprobiert, nur mit dem Emulator.

Zusammenhängende Posts

Warum wird der Firestore onWrite-Trigger nicht im Firebase Cloud-Funktionsemulator aufgerufen?

Ich verwende keine verbotenen Zeichen in der Dokumentauswahl oder erhalte zumindest keine Fehlermeldung.

Firebase Cloud-Funktionen für Firestore werden nicht ausgelöst

Wenn Sie die Funktionen 3.11.0 verwenden und die Funktionen asynchron sind, sollten sie implizit Promise zurückgeben. Die Ergebnisse sind dieselben, wenn ein Wert explizit zurückgegeben wird (z. B. return 0)

https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated

Das sind die offiziellen Dokumente. Soweit ich das beurteilen kann, mache ich das, was die Dokumente sagen. Ich könnte jedoch einfach etwas blendend Offensichtliches vermissen.

Andere Details

  • macOS Big Sur 11.1 (20C69)
  • Firebase CLI 9.1.0

Der Emulator sollte auf dem neuesten Stand sein

Irgendwelche Ideen? Vielen Dank!

Antworten

Nick Jan 04 2021 at 03:15

Es stellte sich heraus, dass ich nur vergessen habe, onMusicUpdatedin die Funktionsdatei index.ts zu importieren . Daher wusste der Emulator nie, dass es ihn gibt!

Geändert

// functions/src/index.ts

export { onMusicCreated } from './music'

zu

// functions/src/index.ts

export { onMusicCreated, onMusicUpdated } from './music'