masa's blog

Masa's Gamesの開発ブログ

FirestoreとFunctionsでシンプルなカウンターを作る

概要

アクセスカウンターのように認証なしでカウントする機能をFirebaseで提供されているFirestoreとFunctionsで実現します。
HTTPトリガーを利用して、/counterにアクセスする度に数値が増えていくようにします。

環境

Firebaseのプロジェクト作成や環境構築についてはここでは割愛します。
無料プランではFunctionsが利用できないようなのでご注意ください。

方法

Firestore

まず、Firestoreに数値を保持するデータを作成しておきます。
ここでは適当に以下のように作成しました。

counter: {
  counter: {
    count: 0
  }
}


Functions

functions/index.jsに関数を作成してデプロイします。

const functions = require("firebase-functions");
const firebase = require("firebase-admin");

firebase.initializeApp();

exports.counter = functions.https.onRequest(async (request, response) => {
  const docRef = firebase.firestore().collection("counter").doc("counter");
  await docRef.update({
    count: firebase.firestore.FieldValue.increment(1),
  }, {merge: true});
  return docRef.get().then((s) => {
    response.send(s.data().count.toString());
  });
});

FieldValue.incrementで指定した分だけ数値を増加させることができます。
トランザクション処理も特に気にしなくてよいので便利です。
https://firebase.blog/posts/2019/03/increment-server-side-cloud-firestore

ただし、更新頻度は最大で1回/1秒ということなので、用途によっては注意が必要かもしれません。
https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja

サーバーサイドからFirestoreを操作する形なので、ルールはデフォルトのallow read, write: if false;のままで大丈夫です。

動作確認

デプロイした関数のurlにアクセスすると数値が増えていきます。