Cloud Functions + RealtimeDatabaseでカウンター的なものを作る

August 7, 2018,
tags: Firebase CloudFunctions RealtimeDatabase


このエントリーをはてなブックマークに追加

最近勉強のためにFirebaseを触っています。
FirebaseってLAMPとは違って、なんというかパラダイムシフトな感じがあるのかなぁーと思い、老害にならないように勉強している最中です。

今回はCloud Functionsで簡単なカウンターの実装を作ってみました。
「検索wordがRealtimeDatabaseに登録されたら、その変更をトリガーに検索回数をユーザー毎に記録する」というものです。
※Firebaseのauthenticationでログインはしているものを想定しています。

const functions = require('firebase-functions');


exports.word = functions.database.ref('/search/{userId}/word').onWrite((change, context) => {
  const word = change.after.val().toLowerCase();
  const counter = change.after.ref.parent.child(`/count/${word}/`).once('once').then((snapshot) => {
    if (snapshot.val() === null) {
      return counter.set(1)
    } else {
      return counter.set(snapshot.val() + 1)
    }
  })
}

RealtimeDatabaseのトリガーについて

CloudFunctionsにはいくつかのトリガーがありますが、今回はRealtimeDatabaseのトリガーを使用しています。
公式ドキュメントにも書いてありますが、以下のようなトリガーがRealtime Databaseには用意されています。

onWrite() Realtime Database でデータが作成、更新、削除されるとトリガーされます。
onCreate() Realtime Database で新しいデータが作成されるとトリガーされます。
onUpdate() Realtime Database でデータが更新されるとトリガーされます。
onDelete() Realtime Database からデータが削除されるとトリガーされます。

今回は検索ワードが新規登録・更新されるときに実行したいので、onWriteを利用しました。
ちなみにトリガー自体はrefで指定したパス以下すべての変更を検知してしまいます。
データ構造は気をつけて設計したほうが良いでしょう。

RealtimeDatabaesの値の取得について

Cloud Functionsの1回の実行では、1回しかデータを取得する必要がありません。
なので、今回はonceを使ってcountのデータを取得しています。
onceはPromiseを返すので、thenのコールバックでデータを取得して処理を書いていきます。

最後に

簡単なコードですが、いつも使ってるLAMP環境とはぜんぜん違うので細かいところでいろいろと苦労します。
でも、簡単にバックエンドの処理が書けるので、フロントエンドとバックエンドのデータ構造が共通で使える場合は積極的にプロダクションに使っていくのはありかと。

comments powered by Disqus