iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
2

上一篇已經了解 Functions 可以如何應用,接下來我們就嘗試運用 Functions 來做一個可以上傳圖片並得到圖片網址與 metadata,範例是參考 Firebase 所提供的檔案:https://github.com/firebase/functions-samples/tree/Node-8/exif-images

這邊也包含非常多範例,例如輸入網址後自動縮網址、產生 coupon 等等:https://github.com/firebase/functions-samples

建立

下載檔案後打開 exif-images 檔案,其中會包含這些檔案,functions 主要是啟用 Firebase functions 的檔案,public 則是之後要發佈到 Firebase hosting 的圖片上傳介面所需要的檔案。

取得檔案之後我們要先安裝 Firebase CLI。不確定是否有安裝的話還是可以輸入指令安裝一次,避免遺漏。

安裝 firebase-tools

npm install -g firebase-tools 

如果沒有連接登入的話要先輸入下面這一行,如果已經登入了會顯示 Already logged in as 你的帳號@gmail.com

firebase login 

接著輸入在本地配置 CLI 的指令,選擇和專案連接的 firebase 專案

firebase use --add

執行指令,在 functions 中安裝 node_modules:

cd functions; 
npm install; 
cd  -

從 functions 中的 index.js 可以看到這邊是對 Firebase 中的 Storage 寫入,當有檔案寫入 Storage,就會觸發事件,也就是去偵測他的下載網址與 Metadata

  • functions.storage.object() 監聽 storage 上的項目更改
  • onFinalize 是指在 storage 中成功創建新的項目時要發送的事件。包含複製或更新這個項目,如果上傳失敗的話就不會觸發這個事件

使用這個範例檔案有一個地方要注意一下,就是在 public 下的 main.js 中取得圖片網址的方式有些改變,若使用範例中原先的檔案會發生錯誤,這邊提供原先與後來的更改:
原本的:

要改成

這樣才能正確的找到 Image URL

部署與測試

建立起檔案與所需要的模組以後,要先部署到 Firebase 才能正確啟用服務,這邊就輸入以下指令來部署專案到 Firebase:

firebase deploy 

成功部署以後可以看到在 Functions 會建立起一個函式

部署時也會將 public 的內容建立到 hosting:site,切換到 Hosting 就可以看到一個網址,點一下後就可以用瀏覽器開啟。

到這邊就可以看到上傳的介面,接著我們就上傳一張圖片來測試看看

點一下 image URL,就可以連結到圖片,這個範例可以當成圖床使用。

回到重點來看一下 Functions 的地方:

每次都仍然會有傳送成功的紀錄!

小結

這邊再整理一下昨天提及 Functions 對 Realtime Database 的觸擊事件方法:

  • onWrite(),在 Realtime Database 中創建,更新或刪除數據時觸發此事件。
  • onCreate(),在 Realtime Database 中創建新數據時觸發此事件。
  • onUpdate(),在 Realtime Database 中更新數據時觸發此事件。
  • onDelete(),從 Realtime Database 中刪除數據時觸發此事件。

Functions 對 Storage 的觸擊事件方法:

  • onArchive 僅在 Storage 啟用了項目版本控制時發送。此事件表示項目的實時版本已經成為了存檔版本,因為它已存檔,或者因為上傳更新了同樣名稱項目而被覆蓋。
  • onDelete 永久刪除項目時發送。
  • onFinalize 是指在 storage 中成功創建新的項目時要發送的事件。包含複製或更新這個項目,如果上傳失敗的話就不會觸發這個事件
  • onMetadataUpdate 在現有項目的 Metadata 發生更改時發送。

Functions 針對不同的儲存目標會有不同可以觸發的方法,詳細可以參照:https://firebase.google.com/docs/functions/firestore-events?authuser=0

Functions 簡潔了很多要處理的過程,透過 Functions 設定對 Realtime Database 或是 Storage 觸發的事件,就可以監聽並觸發事件來處理要寫入的資料。


上一篇
Firebase Functions - 實現 Serverless (上)
系列文
前端工具百寶箱 - 六角學院30

尚未有邦友留言

立即登入留言