LoginSignup
7
8

More than 5 years have passed since last update.

Firebaseの"child_added"で初期呼出しをスキップする方法

Last updated at Posted at 2016-12-09

課題

みなさん、Firebaseへのデータ登録をNode.jsサーバで監視したい場合どうしてますか?
たとえば、チャットを構築して特定ユーザ宛てのメッセージはアラートを飛ばしたい、みたいなユースケースなど。

普通にNode.jsサーバ側で Reference.on("child_added", function) リスナを張るだけだと、"child_added" の仕様上、起動してリスナを張った直後は登録済みデータの分だけイベントが呼出されてしまい、前述のユースケースの場合、過去のメッセージの数だけアラートが飛んでしまいます。

解決策

そこで、Node.jsサーバ起動時にFirabase上のタイムスタンプを取得して、そのタイムスタンプと対象データのタイムスタンプを比較することで、サーバ起動後に登録されたデータだけイベントを処理させます。

ポイントはFirebase上のタイムスタンプは一度タイムスタンプを登録しないと取得できないところです。

コードイメージ

sample
var firebase = require("firebase");
firebase.initializeApp({
  // TODO:初期化設定
});

var db = firebase.database();

/** 起動タイムスタンプ */
var STARTUP_TIMESTAMP = null;

var initialize = function() {
  // まずタイムスタンプと登録して
  db.ref("temp").set({
    "timestamp": firebase.database.ServerValue.TIMESTAMP
  });

  // 登録したタイムスタンプを取得。
  db.ref("temp").once("value", function(tSnapshot) {
    STARTUP_TIMESTAMP = tSnapshot.val().timestamp;

    // リスナ登録
    db.ref('messages').on("child_added", function(mSnapshot) {
      var messageData = mSnapshot.val();

      // タイムスタンプ比較
      if (messageData.timestamp > STARTUP_TIMESTAMP) {
        // TODO:イベント処理
      }
    });
  });
}

initialize();

このテクニックはチャットSDK「Bメッセ」で使っています。
もし他によい方法をご存知でしたらコメントください!

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8