La funzione Firestore onUpdate non si attiva
Il problema
Sto usando le funzioni cloud di Firebase con l'emulatore e, per qualche motivo, il onUpdate
trigger non si attiva, ma la onCreate
funzione si attiva.
Tutto il codice è TypeScript ed è trasferito in JS per lavorare sulle funzioni 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')
})
Entrambe le funzioni sono asincrone perché nel codice finale,
Sul front-end, quando eseguo la add
funzione sul front-end, la onCreate
funzione si attiva.
const { id } = await firebase.firestore().collection('music').add({ title: 'hello world' })
Il log della console viene eseguito come previsto e l'emulatore lo invia alla console:
i functions: Beginning execution of "onMusicCreated"
i functions: Finished "onMusicCreated" in ~1s
Tuttavia, quando aggiorno lo stesso documento, la onUpdate
funzione non viene eseguita.
// "id" is the same id as above
await firebase.firestore().doc(`music/${id}`).update({ title: 'new title' })
Non succede niente. Posso confermare che il documento è effettivamente aggiornato quando guardo nell'emulatore Firestore. Mi manca qualcosa di ovvio? Il codice front-end è semplificato rispetto al mio utilizzo effettivo, ma il codice delle funzioni non è affatto semplificato. E posso confermare che il documento Firestore è stato creato e aggiornato come mi sarei aspettato.
Nessun messaggio di errore nella console o nei log.
Passaggi di debug
- Ho controllato per assicurarmi che il codice delle funzioni sia stato trasferito correttamente in JS. Entrambi ho esaminato l'output del codice e aggiornato più volte il codice onCreate per assicurarmi che la funzione fosse aggiornata
- Ho svuotato tutto il mio codice all'interno delle funzioni (come mostrato sopra), quindi posso confermare che la funzione stessa non è in esecuzione
- La funzione onUpdate accetta tecnicamente due parametri. Stessi risultati con entrambi i parametri.
- Non ho provato le funzioni in produzione, solo con l'emulatore.
Post correlati
Perché il trigger onWrite di firestore non viene richiamato sull'emulatore di funzioni cloud di Firebase?
Non sto usando caratteri proibiti nel selettore di documenti, o almeno non ricevo quel messaggio di errore.
Le funzioni Firebase Cloud per Firestore non si attivano
Utilizzando le funzioni 3.11.0 e le funzioni sono asincrone, quindi dovrebbero restituire implicitamente Promise. I risultati sono gli stessi quando si restituisce esplicitamente un valore (ad esempio return 0
)
https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated
Questi sono i documenti ufficiali. Per quanto ne so, sto facendo quello che dicono i dottori. Tuttavia, potrei semplicemente perdere qualcosa di accecantemente ovvio.
Altri dettagli
- macOS Big Sur 11.1 (20C69)
- Firebase CLI 9.1.0
L'emulatore dovrebbe essere aggiornato
Qualche idea? Grazie!
Risposte
Risulta che mi sono appena dimenticato di importare onMusicUpdated
nel file delle funzioni index.ts. Quindi l'emulatore non ha mai saputo che esistesse!
Cambiato
// functions/src/index.ts
export { onMusicCreated } from './music'
per
// functions/src/index.ts
export { onMusicCreated, onMusicUpdated } from './music'