LoginSignup
8
5

More than 5 years have passed since last update.

FirebaseとAlgoliaを自動反映させる

Posted at

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

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によってはエラーが出る可能性があるので注意してください。
間違い等ありましたら連絡してください。

8
5
0

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
8
5