Funkcja Firestore onUpdate nie uruchamia się
Problem
Używam funkcji chmury Firebase z emulatorem iz jakiegoś powodu onUpdate
wyzwalacz nie jest wyzwalany, ale onCreate
funkcja wyzwala.
Cały kod jest napisany w języku TypeScript i jest transponowany do JS w celu pracy z funkcjami chmury.
// 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')
})
Obie funkcje są asynchroniczne, ponieważ w końcowym kodzie
W interfejsie użytkownika, kiedy uruchamiam add
funkcję na interfejsie użytkownika, onCreate
funkcja uruchamia się.
const { id } = await firebase.firestore().collection('music').add({ title: 'hello world' })
Dziennik konsoli działa zgodnie z oczekiwaniami, a emulator wyprowadza to do konsoli:
i functions: Beginning execution of "onMusicCreated"
i functions: Finished "onMusicCreated" in ~1s
Jednak kiedy aktualizuję ten sam dokument, onUpdate
funkcja nie działa.
// "id" is the same id as above
await firebase.firestore().doc(`music/${id}`).update({ title: 'new title' })
Nic się nie dzieje. Mogę potwierdzić, że dokument jest rzeczywiście zaktualizowany, gdy patrzę w emulator firestore. Czy brakuje mi czegoś oczywistego? Kod interfejsu użytkownika jest uproszczony w porównaniu z moim rzeczywistym użyciem, ale kod funkcji nie jest wcale uproszczony. Mogę potwierdzić, że dokument Firestore został utworzony i zaktualizowany zgodnie z oczekiwaniami.
Brak komunikatów o błędach w konsoli ani w dziennikach.
Kroki debugowania
- Sprawdziłem, czy kod funkcji został poprawnie przetransponowany do JS. Spojrzałem na wynik kodu, a także wielokrotnie aktualizowałem kod onCreate, aby upewnić się, że funkcja została zaktualizowana
- Wydrążałem cały kod wewnątrz funkcji (jak pokazano powyżej), więc mogę potwierdzić, że sama funkcja nie działa
- Funkcja onUpdate technicznie akceptuje dwa parametry. Te same wyniki dla obu parametrów.
- Nie próbowałem funkcji w produkcji, tylko z emulatorem.
Powiązane posty
Dlaczego wyzwalacz Firestore onWrite nie jest wywoływany w emulatorze funkcji chmury Firebase?
Nie używam żadnych niedozwolonych znaków w selektorze dokumentów lub przynajmniej nie otrzymuję tego komunikatu o błędzie.
Funkcje Firebase w chmurze dla Firestore nie uruchamiają się
Używając funkcji 3.11.0, funkcje są asynchroniczne, dlatego powinny niejawnie zwracać Promise. Wyniki są takie same, gdy jawnie zwraca wartość (np. return 0
)
https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated
To oficjalne dokumenty. O ile mogę powiedzieć, robię to, co mówią doktorzy. Mogłem jednak przegapić coś oślepiająco oczywistego.
Inne szczegóły
- macOS Big Sur 11.1 (20C69)
- Firebase CLI 9.1.0
Emulator powinien być aktualny
Jakieś pomysły? Dzięki!
Odpowiedzi
Okazuje się, że po prostu zapomniałem zaimportować onMusicUpdated
do pliku funkcji index.ts. Dlatego emulator nigdy nie wiedział, że istnieje!
Zmieniony
// functions/src/index.ts
export { onMusicCreated } from './music'
do
// functions/src/index.ts
export { onMusicCreated, onMusicUpdated } from './music'