Firestore with Algolia

Walker Chen
Parenting 數位研發
5 min readDec 6, 2018

透過 Cloud Functions 同步 Firestore 與 Algolia 資料

本篇文章接續上篇 Firestore with VueJS,說明 Firestore 如何透過 Cloud Functions 整合 Algolia,以求即時的全文搜索功能。

在本次活動當中,客戶可能基於各種原因未攜帶票券至現場,為此工作人員可能得依各種搜尋條件查詢客戶的票券資料。為因應此需求,我們最終選用了 Algolia 的服務。有關 Algolia 的介紹可參考官方網站,本文旨在說明如何將 Firestore 的資料同步至 Aloglia,其餘部分將留待後續文章討論。

Cloud Functions for Firebase

Cloud Functions 是運行在 Google Cloud 代管環境的程式。我們不用煩惱伺服器的架設跟管理,只需將寫好的代碼部署上去執行。Cloud Functions for Firebase 進一步幫我們連結 Firebase 專案,讓我們不必太多設定即可監聽 Firebase 事件,進而觸發我們所寫的程式。

以本次活動為例,我們主要透過 Cloud Functions 監聽所有對 Firestore 資料的新增/修改/刪除,將此操作同樣進行至 Algolia,達到雙方資料的同步:

Step1. initialize

開發 Cloud Functions 建議使用 Firebase CLI,透過 npm 安裝:

$ npm install -g firebase-tools

安裝後,登入自己的 Firebase 帳號,選擇要開發的專案

$ firebase login

接著進到專案資料夾,執行初始化指令,便會產生 functions/ 目錄:

$ firebase init functions
截至 https://firebase.google.com/docs/functions/get-started

與 Cloud Functions 相關的檔案皆在 functions/ 底下,若此專案同時使用其他 Firebase 服務(例如 Hosting),便會有其他目錄產生,並有各自的 node_modules/package.json 來管理各自使用的套件。

Step2. Write functions

目錄產生之後,便可以開始撰寫代碼。打開 index.js,我們首先引入 firebase-functions 這個 SDK,它提供多種 firebase 的監聽事件,讓我們無需任何設定,便可監聽 firestore 的資料改變;接著再引入 firebase-admin,使程式可以存取 firestore 的資料。

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

接著開始撰寫函式。我們要做的事情很簡單:監聽 firestore 的所有操作,一旦資料有所變動,便將資料同步至 Algolia。(具體的運作流程便不贅述)

exports.函式名稱 = functions.firestore.document('tickets/{ticketId}').onWrite((change, context) => {
if (change.after.exists) { // on create or update
// 將變更後的資料儲存至 Algolia} else if (change.before.exists) { // on delete// 將 Algolia 的資料刪除}
});

firebase-functions SDK 提供四種 firestore 的監聽事件:onCreateonUpdateonDeleteonWrite,細節可直接參考官方文件

Step3. Deploy functions

寫好函式之後,執行 deploy 指令,便可完成部署。之後到 Firebase Console 確認函式是否正確執行即可。

$ firebase deploy --only functions

Tips

1. Set env config

Cloud Functions 中若要引入環境參數,需透過指令完成:

$ firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

查看當前設定:

$ firebase functions:config:get

在程式中取得參數:

const SERVICE_ID = functions.config().someservice.id;
const SERVICE_KEY = functions.config().someservice.key;

2. Delete Cloud Functions

Firebase CLI 並未提供刪除 Cloud Functions 的指令,若想註銷函式,只要將該段函式的程式碼刪除,重新 deploy 一次即可。

--

--