A função Firestore onUpdate não dispara

Jan 02 2021

O problema

Estou usando funções de nuvem do Firebase com o emulador e, por algum motivo, o onUpdategatilho não está disparando, mas a onCreatefunção é disparada.

Todo o código é TypeScript e é transpilado para JS para trabalhar em funções de nuvem.

// 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 as funções são assíncronas porque no código final,

No front-end, quando executo a addfunção no front-end, a onCreatefunção é acionada.

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

O registro do console é executado conforme o esperado e o emulador envia isso para o console:

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

No entanto, quando eu atualizo o mesmo documento, a onUpdatefunção não funciona.

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

Nada acontece. Posso confirmar que o documento está realmente atualizado quando olho no emulador do firestore. Estou perdendo algo óbvio? O código de front-end é simplificado em comparação ao meu uso real, mas o código de funções não é nem um pouco simplificado. E posso confirmar que o documento firestore foi criado e atualizado conforme esperado.

Nenhuma mensagem de erro no console ou nos logs.

Etapas de depuração

  • Verifiquei se o código das funções foi transpilado corretamente para JS. Eu olhei para a saída do código, bem como atualizei o código onCreate várias vezes para garantir que a função fosse atualizada
  • Eu esvaziei todo o meu código dentro das funções (como mostrado acima), para que eu possa confirmar que a função em si não está sendo executada
  • A função onUpdate aceita tecnicamente dois parâmetros. Mesmos resultados com ambos os parâmetros.
  • Não experimentei as funções em produção, apenas com o emulador.

Postagens relacionadas

Por que o gatilho do Firestore onWrite não é invocado no emulador de funções de nuvem do Firebase?

Não estou usando nenhum caractere proibido no seletor de documentos, ou pelo menos não estou recebendo essa mensagem de erro.

Firebase Cloud Functions para Firestore não são acionados

Usando funções 3.11.0 e as funções são assíncronas, portanto, devem retornar implicitamente Promise. Os resultados são os mesmos ao retornar explicitamente um valor (por exemplo, return 0)

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

Esses são os documentos oficiais. Pelo que posso dizer, estou fazendo o que os médicos dizem. Eu poderia estar perdendo algo incrivelmente óbvio, no entanto.

Outros detalhes

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

O emulador deve estar atualizado

Alguma ideia? Obrigado!

Respostas

Nick Jan 04 2021 at 03:15

Acontece que esqueci de importar onMusicUpdatedo arquivo de funções index.ts. Portanto, o emulador nunca soube que ele existia!

Alterado

// functions/src/index.ts

export { onMusicCreated } from './music'

para

// functions/src/index.ts

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