將應用程式連線至 Cloud Storage for Firebase 模擬器

將應用程式連線至 Cloud Storage for Firebase 模擬器之前,請務必瞭解整體 Firebase 本機模擬器套件的工作流程,並安裝及設定本機模擬器套件並查看其 CLI 指令

選擇 Firebase 專案

Firebase 本機模擬器套件可模擬單一 Firebase 專案中的產品。

如要選取要使用的專案,請先透過 CLI 在工作目錄中執行 firebase use,再啟動模擬器。或者,您也可以將 --project 標記傳遞至每個模擬器指令。

本機模擬器套件支援模擬「實際」的 Firebase 專案和示範專案。

專案類型 功能與特色 與模擬器搭配使用
真實

真正的 Firebase 專案是您建立及設定的專案 (很有可能透過 Firebase 控制台進行)。

真實專案包含使用中的資源,例如資料庫執行個體、儲存空間值區、函式,或是您為該 Firebase 專案設定的任何其他資源。

使用實際的 Firebase 專案時,您可以針對任何或所有支援的產品執行模擬器。

針對並非您要模擬的任何產品,應用程式和程式碼會與即時資源 (資料庫執行個體、儲存空間值區、函式等) 互動。

示範

示範 Firebase 專案沒有實際的 Firebase 設定,也沒有即時資源。一般來說,您可以透過程式碼研究室或其他教學課程存取這些專案。

示範專案的專案 ID 含有 demo- 前置字串。

使用示範 Firebase 專案時,您的應用程式和程式碼「只會」與模擬器互動。如果應用程式嘗試與未執行模擬器的資源互動,該程式碼將會失敗。

建議您盡可能使用示範專案。Meet 具備以下優點:

  • 設定更簡單,因為您無須建立 Firebase 專案即可執行模擬器
  • 安全性較高,因為如果程式碼意外叫用非模擬的 (正式環境) 資源,就無法變更資料、使用及計費
  • 改善離線支援功能,因為不需透過網際網路即可下載 SDK 設定。

檢測應用程式,以便與模擬器通訊

Android、Apple 平台和 Web SDK

設定應用程式內設定或測試類別,與 Cloud Storage for Firebase 模擬器互動,如下所示。

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val storage = Firebase.storage
storage.useEmulator("10.0.2.2", 9199)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseStorage storage = FirebaseStorage.getInstance();
storage.useEmulator("10.0.2.2", 9199);
Swift
Storage.storage().useEmulator(withHost: "127.0.0.1", port: 9199)

Web

const { getStorage, connectStorageEmulator } = require("firebase/storage");

const storage = getStorage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  connectStorageEmulator(storage, "127.0.0.1", 9199);
} 

Web

var storage = firebase.storage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  storage.useEmulator("127.0.0.1", 9199);
} 

您不需要進行額外設定,即可使用模擬器測試 Cloud Storage for Firebase 事件觸發的 Cloud 函式。當 Cloud Storage for Firebase 和 Cloud Functions 模擬器同時執行時,兩者會自動搭配運作。

管理員 SDK

設定 FIREBASE_STORAGE_EMULATOR_HOST 環境變數時,Firebase Admin SDK 會自動連線至 Cloud Storage for Firebase 模擬器:

export FIREBASE_STORAGE_EMULATOR_HOST="127.0.0.1:9199"

請注意,Cloud Functions 模擬器會自動知道 Cloud Storage for Firebase 模擬器,因此您可以在測試 Cloud Functions 與 Cloud Storage for Firebase 模擬器之間的整合時略過這個步驟。系統將在 Cloud Storage for Firebase 中自動為 Admin SDK 設定環境變數。

如要讓 Admin SDK 程式碼連線至在其他環境中執行的共用模擬器,您必須指定使用 Firebase CLI 設定的相同專案 ID。您可以將專案 ID 直接傳遞至 initializeApp,或是設定 GCLOUD_PROJECT 環境變數。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
環境變數
export GCLOUD_PROJECT="your-project-id"

匯入及匯出資料

資料庫和 Cloud Storage for Firebase 模擬器可讓您從執行中的模擬器執行個體匯出資料。定義要在單元測試或持續整合工作流程中使用的基準資料集,然後匯出供團隊成員共用。

firebase emulators:export ./dir

在測試中,在模擬器啟動時匯入基準資料。

firebase emulators:start --import=./dir

您可以指示模擬器在關機時匯出資料,方法是指定匯出路徑,或者直接使用傳遞至 --import 標記的路徑。

firebase emulators:start --import=./dir --export-on-exit

這些資料匯入和匯出選項也適用於 firebase emulators:exec 指令。詳情請參閱模擬器指令參考資料

Cloud Storage for Firebase 模擬器與實際工作環境的差異

為了測試用戶端應用程式,Cloud Storage for Firebase 模擬器幾乎與 Firebase API 介面區域完全一致。所有 Firebase 指令預期可在一般 Firebase SDK (網頁、Android 和 Apple 平台) 之間運作。

伺服器端應用程式測試設有限制。Firebase Admin SDK 會使用 Google Cloud API 介面,且不會模擬這個 API 的所有端點。原則上,凡是可透過用戶端 SDK 執行的操作 (上傳或刪除檔案、取得及設定中繼資料) 也都是實作為從 Admin SDK 使用,除了不允許的做法以外。下方列出幾個常見的排除設定。

與 Google Cloud Storage 的差異

Cloud Storage for Firebase 產品 (包括 Storage 模擬器) 提供一部分 Google Cloud Storage (GCS) 功能,著重在對開發 Firebase 應用程式非常有幫助的儲存物件。Cloud Storage for Firebase 與 GCS 的差異如下:

  • Cloud Storage for Firebase 目前不支援建立、列出、取得或刪除儲存空間值區的 Bucket API。
  • Google Cloud Storage Objects API 支援下列方法:copydeletegetinsertlistpatchrewriteupdate

Cloud IAM

Firebase 模擬器套件不會試圖複製或尊重任何在執行時與 IAM 相關的行為。模擬器符合所提供的 Firebase 安全性規則,但在通常會使用 IAM 的情況下 (例如設定 Cloud Functions 叫用服務帳戶,因此權限),模擬器將無法設定,而且將使用開發人員機器上的全域可用帳戶,類似直接執行本機指令碼。

Pub/Sub 通知

Cloud Storage for Firebase 模擬器不會與 Cloud Pub/Sub 模擬器整合,因此不支援建立儲存物件變更的管道/通知。建議您直接使用 Cloud Functions Storage 觸發條件。

值區層級中繼資料

Cloud Storage for Firebase 模擬器不支援任何值區層級的設定,包括儲存空間級別、值區層級 CORS 設定、標籤或保留政策。Firebase 希望持續改善這項支援功能。

接下來呢?