JavaScript
Node.js
Firebase
algolia

FirebaseとAlgoliaを自動反映させる

本記事はこの記事の内容で使用したものです。

Firebaseのデータベースに変更があったときにそれを自動でAlgoliaのインデックスに反映してくれるようにします。

Node.jsをインストールします。

記事はいくらでもあるので参考にしてください。

node -v
v5.11.0

以下のパッケージを入れます。

npm install dotenv --save
npm install algoliasearch --save
npm install firebase --save

変数名「contactsRef」以下のデータに変化があった場合、それをAlgoliaのインデックスに反映させます。
Nodeが動いていないと働かないのでローカル以外で開発するときは外部サーバでNodeを動かした方がやりやすいです。

index.js
const algoliasearch = require('algoliasearch');
const dotenv = require('dotenv');
const firebase = require('firebase/app');

require('firebase/auth');
require('firebase/database');
dotenv.load();

// 接続するFirebaseのデータベースURL
var config = {
  databaseURL: "https://XXXXXXXXXXXX.firebaseio.com",
};
firebase.initializeApp(config);
const database = firebase.database();

// configure algolia
const algolia = algoliasearch(
  "XXXXXXXXXXX",                 //←Algoliaの「Application ID」
  "XXXXXXXXXXXXXXXXXX"           //←Algoliaの「Admin API Key」
);
const index = algolia.initIndex("sample");  //接続するAlgoliaのindex名


const contactsRef = database.ref('/msg'); //変更を反映する範囲を指定する今回は[msg]以下に変化があった場合に反映させている。
contactsRef.on('child_added', addOrUpdateIndexRecord);
contactsRef.on('child_changed', addOrUpdateIndexRecord);
contactsRef.on('child_removed', deleteIndexRecord);

// 「contactsRef」の中で新しいデータが追加されたらAlgoliaのindexに反映する関数。
function addOrUpdateIndexRecord(contact) {
  const record = contact.val();
  record.objectID = contact.key;

  index
    .saveObject(record)
    .then(() => {
      console.log('Firebase object indexed in Algolia', record.objectID);
    })
    .catch(error => {
      console.error('Error when indexing contact into Algolia', error);
      process.exit(1);
    });
}

// 「contactsRef」の中でデータが削除されたらAlgoliaのindexに反映する関数。
function deleteIndexRecord(contact) {
  const objectID = contact.key;

  index
    .deleteObject(objectID)
    .then(() => {
      console.log('Firebase object deleted from Algolia', objectID);
    })
    .catch(error => {
      console.error('Error when deleting contact from Algolia', error);
      process.exit(1);
    });
}
package.json
{
  "name": "sample",
  "version": "0.0.0",
  "description": "sample",
  "dependencies": {
    "algoliasearch": "^3.24.9",
    "dotenv": "^4.0.0",
    "firebase-admin": "~5.8.1"
  }
}
node index.js

まとめ

公式の記事を参考に作りましたが、その通りにやるとエラーで動かないので少し変えています。Versionによってはエラーが出る可能性があるので注意してください。
間違い等ありましたら連絡してください。