Funkcja Firestore onUpdate nie uruchamia się

Jan 02 2021

Problem

Używam funkcji chmury Firebase z emulatorem iz jakiegoś powodu onUpdatewyzwalacz nie jest wyzwalany, ale onCreatefunkcja 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 addfunkcję na interfejsie użytkownika, onCreatefunkcja 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, onUpdatefunkcja 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

Nick Jan 04 2021 at 03:15

Okazuje się, że po prostu zapomniałem zaimportować onMusicUpdateddo 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'