将您的应用连接到 Cloud Storage 模拟器

在将您的应用连接到 Cloud Storage 模拟器之前,请确保您了解 Firebase Local Emulator Suite 的整体工作流程,并安装和配置Local Emulator Suite 并查看其CLI 命令

选择一个 Firebase 项目

Firebase 本地模拟器套件模拟单个 Firebase 项目的产品。

要选择要使用的项目,在启动模拟器之前,请在 CLI 中在您的工作目录中运行firebase use 。或者,您可以将--project标志传递给每个模拟器命令。

Local Emulator Suite 支持模拟真实的Firebase 项目和演示项目。

项目类型特征与模拟器一起使用
真实的

真正的 Firebase 项目是您创建和配置的项目(很可能通过 Firebase 控制台)。

真实项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

在处理真正的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

对于您未模拟的任何产品,您的应用程序和代码将与实时资源(数据库实例、存储桶、函数等)进行交互。

演示

演示 Firebase 项目没有真正的Firebase 配置,也没有实时资源。这些项目通常通过代码实验室或其他教程访问。

演示项目的项目 ID 具有demo-前缀。

使用演示 Firebase 项目时,您的应用和代码与模拟器交互。如果您的应用程序尝试与未运行模拟器的资源进行交互,则该代码将失败。

我们建议您尽可能使用演示项目。好处包括:

  • 设置更简单,因为您无需创建 Firebase 项目即可运行模拟器
  • 更强的安全性,因为如果您的代码意外调用非模拟(生产)资源,则不会发生数据更改、使用和计费
  • 更好的离线支持,因为无需访问互联网即可下载您的 SDK 配置。

检测您的应用程序以与模拟器对话

Android、Apple 平台和 Web SDK

设置您的应用内配置或测试类以与 Cloud Storage 模拟器交互,如下所示。

安卓
FirebaseStorage.getInstance().useEmulator("10.0.2.2", 9199);
迅速
Storage.storage().useEmulator(withHost:"localhost", port:9199)
网络 v8
var storage = firebase.storage();
storage.useEmulator("localhost", 9199);
网络 v9
import { getStorage, connectStorageEmulator } from "firebase/storage";

const storage = getStorage();
connectStorageEmulator(storage, "localhost", 9199);

无需额外设置即可使用模拟器测试由 Cloud Storage 事件触发的Cloud 功能。当 Cloud Storage 和 Cloud Functions 模拟器都在运行时,它们会自动协同工作。

管理 SDK

设置FIREBASE_STORAGE_EMULATOR_HOST环境变量后,Firebase Admin SDK 会自动连接到 Cloud Storage 模拟器:

export FIREBASE_STORAGE_EMULATOR_HOST="localhost:9199"

请注意,Cloud Functions 模拟器会自动识别 Cloud Storage 模拟器,因此您可以在测试 Cloud Functions 和 Cloud Storage 模拟器之间的集成时跳过此步骤。环境变量将自动为 Cloud Storage 中的 Admin SDK 设置。

如果您希望您的 Admin SDK 代码连接到在另一个环境中运行的共享模拟器,则需要指定您使用 Firebase CLI 设置的相同项目 ID 。您可以将项目 ID 直接传递给initializeApp或设置GCLOUD_PROJECT环境变量。

Node.js 管理 SDK
admin.initializeApp({ projectId: "your-project-id" });
环境变量
export GCLOUD_PROJECT="your-project-id"

导入和导出数据

数据库和 Cloud Storage 模拟器允许您从正在运行的模拟器实例中导出数据。定义要在单元测试或持续集成工作流中使用的基线数据集,然后将其导出以在团队之间共享。

firebase emulators:export ./dir

在测试中,在模拟器启动时,导入基线数据。

firebase emulators:start --import=./dir

您可以指示模拟器在关机时导出数据,可以指定导出路径,也可以简单地使用传递给--import标志的路径。

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

这些数据导入和导出选项也适用于firebase emulators:exec命令。有关更多信息,请参阅模拟器命令参考

Cloud Storage 模拟器与生产环境有何不同

对于客户端应用程序的测试,Cloud Storage 模拟器在 Firebase API 表面积方面几乎完美地与生产环境保持一致。所有 Firebase 命令都应在常规 Firebase SDK(Web、Android 和 Apple 平台)之间运行。

对于服务器端应用程序的测试,存在限制。 Firebase Admin SDK 使用 Google Cloud API 表面,并非此 API 的所有端点都被模拟。根据经验,可以从客户端 SDK 完成的任何操作(上传或删除文件、获取和设置元数据)也可以从 Admin SDK 使用,但除此之外的任何事情都不是。下面列出了值得注意的例外情况。

云 IAM

Firebase Emulator Suite 不会尝试复制或尊重任何与 IAM 相关的运行行为。模拟器遵守提供的 Firebase 安全规则,但在通常使用 IAM 的情况下,例如设置调用服务帐户的 Cloud Functions 并因此设置权限,模拟器是不可配置的,并将使用您的开发人员机器上的全局可用帐户,类似于直接运行本地脚本。

发布/订阅通知

Cloud Storage 模拟器不与 Cloud Pub/Sub 模拟器集成,因此不支持为存储对象更改创建通道/通知。我们建议直接使用 Cloud Functions Storage 触发器。

桶级元数据

Cloud Storage 模拟器不支持任何存储分区级别的配置,包括存储类、存储分区级别的 CORS 配置、标签或保留策略。 Firebase 打算随着时间的推移改进这种支持。

接下来是什么?