Firestore onUpdate-Funktion wird nicht ausgelöst
Das Problem
Ich verwende Firebase-Cloud-Funktionen mit dem Emulator, und aus irgendeinem Grund wird der onUpdate
Trigger nicht ausgelöst, die onCreate
Funktion 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 add
im Frontend die Funktion im Frontend ausführe , wird die onCreate
Funktion 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 onUpdate
Funktion 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
Es stellte sich heraus, dass ich nur vergessen habe, onMusicUpdated
in 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'