2018年10月6日 星期六

【Firebase】使用cloud functions建立「自動遞增」資料欄位

Firebase是專為行動應用打造的雲端平台,雖有其收費機制,但仍有提供部份免費流量。加上Angular 6也已將Firebase資料庫存取的程式碼納入專案中(@angular/fire,原為angularfire2套件),故以ionic-angular為主體的Ionic 4 App,拿Firebase做為雲端資料庫平台,在開發上可說十分方便。

然而,Firebase新版資料庫Cloud Firestore屬於NoSQL文件資料庫(No SQL document database),運作方式與傳統關聯式資料庫有所不同。其中最大的差異之一是Firestore沒有「自動遞增」,而是以亂數編碼產生unique id。

因此,一旦需要類似員工編號這類不能重複的流水號,在firestore資料庫裡便要自行建立「自動遞增」(auto increment) 機制。本文將介紹以cloud functions實做database trigger,在新增一筆文件時,便會觸發cloud function,在文件加入編號欄位,同時更新流水號。

前置動作
需先至Firebase控制台新增專案,並啟用Cloud Firestore資料庫。進入Firestore資料庫建立counters集合,在其下新增文件users,內有count欄位;該欄位用來儲存自動遞增流水號。另外,也建立users集合,如下圖所示:
在Firestore建立couters/users文件,內有count欄位,用以儲存自動遞增流水號

users集合用來儲存員工資料,每新增一筆員工資料,便應該觸發cloud function,將員工編號加入員工資料。

建立cloud functions
由於cloud functions是儲存在Firebase平台上,故需以firebase-tools建立,最後還必須佈署到雲端,相關步驟如下:
npm install -g firebase-tools
firebase login
以google帳號登入後,即可使用firebase CLI工具,建立cloud functions。
firebase init functions

新增cloud functions過程需做"Project Setup"與"Functions Setup"兩部份,依照步驟指示逐一設定即可。"Project Setup"步驟如下圖,需選定對應專案:
專案設定:用上下鍵選擇想要關聯的Firebase專案
"Functions Setup"則分為幾個步驟,其中最重要的是選擇程式語言JavaScript或TypeScript,本文選擇JavaScript (Firebase使用Node.js) :
 Functions設定:選擇JavaScript語言、使用TSLint、立即安裝相依套件
cloud functions建立完畢,切換進functions資料夾,便可編輯index.js。

index.js程式碼如下:

  • 第3-4行:cloud functions功能也就是事件驅動的部份,例如新增一份文件的事件,是透過'firebase-functions'提供,但資料庫firestore的存取則是在'firebase-admin',故需require兩者。
  • 第6行:cloud functions初始化。
  • 第11行:admin.firestore()取得資料庫參考變數。
  • 第22-23行:functions.firestore.document(document)是用來登錄資料庫寫入動作的觸發處理器,其中.onCreate(snap, context)是新增一份文件的觸發處理器。詳情可參考:Cloud Firestore事件
  • 第24行:由於文件新增時,cloud function必須完成 (1)讀取counter,(2) 更新文件加入員工編號欄位 (3)更新counter(遞增),故必須用transaction處理。
  • 第25行:snap.ref為此次新增文件的參考變數,透過它才能加入員工編號。
  • 第27-28行:動作(1) 讀取目前的counter(位於counters/users的count欄位)。
  • 第29-32行:動作(2) 將員工編號加入文件中。
  • 第33-36行:動作(3) 更新counter。
佈署Cloud Functions
執行下列指令,將cloud functions佈署到Firebase雲端平台:
firebase deploy --only functions

佈署成功後,便可從雲端平台手動加入一份文件到users集合,並從Functions功能裡查看訊息:
查看事件訊息
使用版本
firebase-tools: 5.0.1
Cloud Functions API 2.0

延伸閱讀:
  1. Cloud Functions建立範例:https://firebase.google.com/docs/functions/get-started
  2. Cloud Firestore事件
  3. Distributed counters範例

沒有留言:

張貼留言