2020.2.28

Cloud FunctionsをHTTPリクエストで呼び出してFirestoreのデータを操作(更新)

Cloud FunctionsをHTTPリクエストで呼び出すようにして、Firesotreに登録されているデータを更新する方法についてメモしておきます。

目次

  • Functionsの作成(コード)
  • デプロイ
  • 動作確認(HTTPリクエスト)
  • 参考リンク

Functionsの作成(コード)

Cloud Functionsで作成した関数をHTTPリクエストで呼び出されるようにするには https.onRequest() を使用します。


const functions = require('firebase-functions');
const admin = require("firebase-admin")
admin.initializeApp()
const fireStore = admin.firestore()

exports.executeExpired = functions
  .region('asia-northeast1')
  .https.onRequest((req, res) => {

  // 10日前の日時(ミリ秒)
  var expiredAt = (new Date()).getTime() - (10 * 24 * 60 * 60 * 1000)

  // 公開から10日経過したデータを期限切れに更新
  fireStore.collection("products").where("expired", "==", false).get().then((docs) => {
    docs.forEach((doc) => {
      if(doc.data().published_at.toDate().getTime() < expiredAt){
        fireStore.collection("products").doc(doc.id).update({
          expired: true
        })
        .then(function() {
          console.log("Document successfully expired!")
          return
        })
        .catch(function(err) {
          console.error("Error expired updatting document: ", err)
        })
      }
    })
    return
  }).catch(function (err) {
    console.error("Error expired getting document: ", err)
  })

  // res.send('executeExpired end')
  res.end()
})

上記のコードは、Firestoreのコレクション「products」に設定された公開日時(published_at)から10日経過したデータに対して、期限切れのフラグ(expired)を true に更新する処理になります。

Functionsの関数からFirestoreのデータを操作するには、firebase-admin を使います。

https.onRequest()を使用する場合、最後に res.end() を記述しないとタイムアウトされるまでリクエストが処理状態になるので注意。レスポンスに何かしらのメッセージを返す場合は res.send('message') を追加します。

Cloud Functionsはデフォルトのリージョンが「us-central1」となっているので、region('asia-northeast1') で切り替えています。

デプロイ

作成した関数をCloud Functionsにデプロイするには、ターミナルから以下のコマンドを実行します。


firebase deploy --only functions

動作確認(HTTPリクエスト)

FirebaseコンソールのFunctionsにアクセスすると、先ほどデプロイした関数が一覧に表示されているので、トリガー欄に記載されているURLをコピーします。

コピーしたURLをブラウザのアドレス欄に貼り付けてアクセスし、ログを確認して関数が正常に実行されていればOKです。

参考リンク

Firebase】関連記事