La función Firestore onUpdate no se activa

Jan 02 2021

El problema

Estoy usando funciones en la nube de Firebase con el emulador y, por alguna razón, el onUpdateactivador no se activa, pero la onCreatefunción sí se activa .

Todo el código es TypeScript y se transpila a JS para que funcione en funciones en la nube.

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

Ambas funciones son asincrónicas porque en el código final,

En el front-end, cuando ejecuto la addfunción en el front-end, la onCreatefunción se activa.

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

El registro de la consola se ejecuta como se esperaba y el emulador genera esto en la consola:

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

Sin embargo, cuando actualizo ese mismo documento, la onUpdatefunción no se ejecuta.

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

No pasa nada. Puedo confirmar que el documento está realmente actualizado cuando miro en el emulador de Firestore. ¿Me estoy perdiendo algo obvio? El código de front-end se simplifica en comparación con mi uso real, pero el código de funciones no se simplifica en absoluto. Y puedo confirmar que el documento de Firestore se creó y se actualizó como esperaba.

No hay mensajes de error en la consola ni en los registros.

Pasos de depuración

  • Verifiqué para asegurarme de que el código de funciones se transpiró correctamente a JS. Me molesté en mirar la salida del código, así como actualizar el código onCreate varias veces para asegurarme de que la función se actualizara
  • Ahuequé todo mi código dentro de las funciones (como se muestra arriba), para poder confirmar que la función en sí no se está ejecutando
  • La función onUpdate técnicamente acepta dos parámetros. Mismos resultados con ambos parámetros.
  • No he probado las funciones en producción, solo con el emulador.

Artículos Relacionados

¿Por qué no se invoca el disparador firestore onWrite en el emulador de funciones en la nube de firebase?

No estoy usando ningún carácter prohibido en el selector de documentos, o al menos no recibo ese mensaje de error.

Firebase Cloud Functions para Firestore no se activa

Usando funciones 3.11.0, y las funciones son asincrónicas, por lo tanto, deberían devolver implícitamente Promise. Los resultados son los mismos cuando se devuelve explícitamente un valor (p. Ej., return 0)

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

Esos son los documentos oficiales. Por lo que puedo decir, estoy haciendo lo que dicen los médicos. Sin embargo, podría estar perdiendo algo deslumbrantemente obvio.

Otros detalles

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

El emulador debe estar actualizado

¿Algunas ideas? ¡Gracias!

Respuestas

Nick Jan 04 2021 at 03:15

Resulta que me olvidé de importar onMusicUpdateden el archivo de funciones index.ts. ¡Por lo tanto, el emulador nunca supo que existía!

Cambiado

// functions/src/index.ts

export { onMusicCreated } from './music'

a

// functions/src/index.ts

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