使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

在本地模拟 Firestore

Google Cloud CLI 提供了适用于 Firestore 的本地内存模拟器,可用于测试应用。您可以将模拟器与所有 Firestore 客户端库搭配使用。您只能将模拟器用于本地测试。

请勿将模拟器用于生产部署。由于模拟器仅将数据存储在内存中,因此数据在各次运行之间不会保留。

安装模拟器

如需安装 Firestore 模拟器,请安装和更新 gcloud CLI:

  1. 安装 gcloud CLI

  2. 更新您的 gcloud CLI 安装以获取最新功能:

    gcloud components update
    

运行模拟器

  1. 运行以下命令启动模拟器:

    gcloud emulators firestore start
    

    该模拟器将输出其运行所在的主机和端口号。

    默认情况下,模拟器会尝试使用 localhost:8080。如需将模拟器绑定到特定主机和端口,请使用可选的 --host-port 标志,并替换 HOSTPORT

    gcloud emulators firestore start --host-port=HOST:PORT
    
  2. 输入 Control + C 以停止模拟器。

连接到模拟器

您连接到模拟器的方式取决于客户端库、服务器客户端库或移动/Web SDK 的类型。

服务器客户端库

如需连接 Firestore 服务器客户端库(C#、Go、Java、Node.js、PHP、Python 和 Ruby),请设置 FIRESTORE_EMULATOR_HOST 环境变量。设置此环境变量后,服务器客户端库会自动连接到模拟器。

export FIRESTORE_EMULATOR_HOST="HOST:PORT"

Android、Apple 平台和 Web SDK

以下示例演示了如何将 Android SDK、Apple 平台 SDK 和 Web SDK 连接到 Firestore 模拟器:

Android
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "localhost:8080"
settings.isPersistenceEnabled = false
settings.isSSLEnabled = false
Firestore.firestore().settings = settings

Web 版本 9

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, 'localhost', 8080);

Web 版本 8

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("localhost", 8080);
}

Firestore 模拟器会在关停时清除数据库内容。Firestore SDK 的离线缓存不会自动清除,因此您可能需要在模拟器配置中停用本地持久化,以避免所模拟的数据库与本地缓存之间出现差异;在 Web SDK 中,系统默认会停用持久化。

清除模拟器数据

Firestore 模拟器包含一个 REST 端点,用于删除模拟器中当前的所有数据。您可以使用此端点清除测试之间的数据,而无需关闭模拟器。

如需删除模拟器中的所有数据,请对以下端点执行 HTTP DELETE 操作,并将 HOSTPORT 替换为您选择的主机和端口,并将 PROJECT_ID 替换为您自己的项目 ID:

http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents

如果模拟器未使用 localhost:8080,请调整主机和端口。 您的代码应等待关于删除完成或失败的 REST 确认信息。

您可以使用 curl 在 shell 中执行此操作:

$ curl -v -X DELETE "http://HOST:PORT/emulator/v1/projects/PROJECT_ID/databases/(default)/documents"

Firestore 模拟器与生产环境的区别

Firestore 模拟器会尝试真实地重现生产服务的行为,但存在一些值得注意的限制。

交易

模拟器无法实现在生产环境中出现的所有事务行为。当您要测试涉及对一个文档执行多次并发写入的功能时,模拟器完成写入请求的速度可能会很慢。在某些情况下,对数据的锁定可能需要长达 30 秒才会解除。如有需要,请考虑相应地调整测试超时。

索引

模拟器不会跟踪复合索引,而是执行任何有效的查询。请务必对照真实的 Firestore 实例测试您的应用,以确定您需要哪些索引。

限制

模拟器不会强制执行生产环境中强制执行的所有限制。例如,模拟器可能允许会因为过大而会被生产服务拒绝的事务。请确保您熟悉文档中说明的限制,并且将您的应用设计为主动避免这些限制。