はじめに
Cloud Firestoreの書き込みをトリガーに、Cloud Functionsでバックエンドコードを実行してみたいと思います。
今回は例として、チャットのメッセージ(messages/)が書き込まれた時にルーム(rooms/)に最新メッセージを書き込むようにしてみます。
(ルーム一覧で最新メッセージをチラ見せさせたい。)
準備
firebase-toolsをインストールしていない場合は下記でインストール。
npm install -g firebase-tools
or
yarn global add firebase-tools
firebase init
今回はTypeScriptを選択。
実装
Firestoreのイベントのトリガーは下記4つになります。
イベント | トリガー |
---|---|
onCreate | ドキュメントが最初にトリガーされた時に呼ばれる |
onUpdate | すでに存在してるドキュメントの値が変更された時に呼ばれる |
onDelete | データを含むドキュメントが削除された時に呼ばれる |
onWrite | onCreate、onUpdate、onDeleteがトリガーされた時に呼ばれる |
今回はメッセージが追加される度に処理したいので「onCreate」を利用します。
コード
functions/srcディレクトリの下にあるindex.tsに処理を追加します。
import * as functions from "firebase-functions";
export const setLatestMessage = functions
.region("asia-northeast1")
.firestore.document("rooms/{roomId}/messages/{messageId}")
.onCreate(async (snap, context) => {
const msgRef = snap.ref;
const roomRef = msgRef.parent.parent;
if (roomRef !== null) {
await roomRef.set(
{
latestMsg: msgRef // 最新メッセージとして登録
},
{ merge: true } // 追加書き込み
);
}
});
補足
functions.region("asia-northeast1")
"asia-northeast1"で東京リージョンになります。
FireStoreをトリガーにするときは、Firestoreのリージョンと合わせた方が良いみたいです。
const roomRef = msgRef.parent.parent;
- messageドキュメントのparent == messagesコレクション
- messagesコレクションのparent == roomドキュメント
これでroomのドキュメントを取得することができます。
デプロイ
yarn deploy
or
npm run deploy
無事にデプロイできたら後はメッセージが追加される度に作成したFunctionが実行されると思います。
感想
今回初めてCloudFunctionsを利用してみたのですが、思ってたよりもすごく簡単に実装できてびっくりしました。
もっと早く利用しておけば良かったと後悔。。
HTTPリクエスト経由でも実行できるみたいなので、今度そちらも試してみたいです。