FirestoreonUpdate関数がトリガーされない

Jan 02 2021

問題

エミュレータでFirebaseクラウド関数を使用していますが、何らかの理由でonUpdateトリガーがトリガーされていませんが、onCreate関数はトリガーされます。

すべてのコードはTypeScriptであり、クラウド機能で動作するようにJSにトランスパイルされます。

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

最終的なコードでは、両方の関数が非同期であるため、

フロントエンドで、フロントエンドでadd関数を実行すると、onCreate関数が起動します。

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

コンソールログは期待どおりに実行され、エミュレータはこれをコンソールに出力します。

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

しかし、同じドキュメントを更新すると、onUpdate関数が実行されません。

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

何も起こりません。ファイヤーストアエミュレーターを見ると、ドキュメントが実際に更新されていることが確認できます。明らかな何かが欠けていますか?フロントエンドのコードは実際の使用に比べて単純化されていますが、関数のコードはまったく単純化されていません。そして、firestoreドキュメントが期待どおりに作成および更新されていることを確認できます。

コンソールまたはログにエラーメッセージはありません。

デバッグ手順

  • 関数コードがJSに正しくトランスパイルされていることを確認しました。私は両方ともコード出力を確認し、関数が更新されたことを確認するためにonCreateコードを複数回更新しました
  • (上記のように)関数内のすべてのコードをくり抜いたので、関数自体が実行されていないことを確認できます
  • onUpdate関数は、技術的に2つのパラメーターを受け入れます。両方のパラメーターで同じ結果。
  • エミュレーターだけで、本番環境で機能を試したことはありません。

関連記事

Firebaseクラウド関数エミュレータでfirestoreonWriteトリガーが呼び出されないのはなぜですか?

ドキュメントセレクタで禁止文字を使用していないか、少なくともそのエラーメッセージが表示されません。

FirestoreのFirebaseCloudFunctionsがトリガーされていません

関数3.11.0を使用すると、関数は非同期であるため、暗黙的にPromiseを返す必要があります。結果はexplicetely値を返すときに(例えば、同じですreturn 0

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

それが公式ドキュメントです。私が知る限り、私はドキュメントが言うことをやっています。しかし、私は盲目的に明白な何かを見逃している可能性があります。

その他の詳細

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

エミュレータは最新である必要があります

何か案は?ありがとう!

回答

Nick Jan 04 2021 at 03:15

onMusicUpdatedindex.ts関数ファイルにインポートするのを忘れたことがわかりました。したがって、エミュレータはそれが存在することを決して知りませんでした!

かわった

// functions/src/index.ts

export { onMusicCreated } from './music'

// functions/src/index.ts

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