Catch up on everthing we announced at this year's Firebase Summit. Learn more

将应用连接到 Cloud Functions 模拟器

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

选择一个 Firebase 项目

Firebase Local Emulator Suite 可以模拟单个 Firebase 项目的产品。

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

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

项目类型 特性 与模拟器结合使用
实际

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

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

使用实际的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

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

演示

演示 Firebase 项目没有实际 Firebase 配置,也没有实时资源。 这些项目通常可通过 Codelab 或其他教程访问。

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

使用演示 Firebase 项目时,您的应用和代码仅与模拟器互动。如果您的应用尝试与您没有为其运行模拟器的资源进行交互,该代码将失败。

我们建议您尽可能使用演示项目。演示项目具有以下优势:

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

对您的应用进行插桩处理以与模拟器通信

针对 Callable 函数对您的应用进行插桩处理

如果您的原型设计和测试活动涉及 Callable 后端函数,请按如下方式配置与 Cloud Functions for Firebase 模拟器的交互:

Android
        // 10.0.2.2 is the special IP address to connect to the 'localhost' of
        // the host computer from an Android emulator.
        FirebaseFunctions functions = FirebaseFunctions.getInstance();
        functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://localhost:5001")

Web 版本 9

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "localhost", 5001);

Web 版本 8

firebase.functions().useEmulator("localhost", 5001);

针对 HTTPS 函数模拟对您的应用进行插桩处理

代码中的每个 HTTPS 函数都将从本地模拟器按以下网址格式提供:

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

例如,采用默认主机端口和区域的简单 helloWorld 函数将在以下位置提供:

https://localhost:5001/$PROJECT/us-central1/helloWorld

针对后台触发的函数模拟对您的应用进行插桩处理

Cloud Functions 模拟器支持以下来源的后台触发函数:

  • Realtime Database 模拟器
  • Cloud Firestore 模拟器
  • Authentication 模拟器
  • Pub/Sub 模拟器

要触发后台事件,请使用适用于您的平台的 SDK 将应用或测试代码连接到模拟器。

还有其他哪些工具可以用来测试 Cloud Functions 函数?

其他原型设计和测试工具可作为对 Cloud Functions 模拟器的补充:

  • Cloud Functions shell,允许对交互式迭代函数进行原型设计和开发。此 shell 采用带有 REPL 样式界面的 Cloud Functions 模拟器进行开发。未提供与 Cloud Firestore 或 Realtime Database 模拟器的集成。借助 shell,您可以模拟数据并执行函数调用,从而模拟与 Local Emulator Suite 目前不支持的产品(如 Cloud Storage、Pub/Sub、Analytics、Remote Config、Storage、Auth 和 Crashlytics)之间的交互方式。
  • Firebase Test SDK for Cloud Functions,一种使用 Mocha 框架进行函数开发的 Node.js 环境。事实上,Cloud Functions Test SDK 在 Cloud Functions shell 上提供了自动化功能。

如需详细了解 Cloud Functions shell 和 Cloud Functions Test SDK,请参阅以交互方式测试函数Cloud Functions 单元测试

Cloud Functions 模拟器与生产环境的区别

对于大多数使用场景,Cloud Functions 模拟器与生产环境相当接近。我们投入了大量精力来确保节点运行时中的一切尽可能接近生产环境。不过,模拟器不会模拟完整的容器化生产环境,因此虽然函数代码会按实际方式执行,但环境的其他方面(即本地文件、函数崩溃后的行为等)则会有所不同。

Cloud IAM

Firebase Emulator Suite 不会尝试复制或遵从任何与 IAM 相关的运行行为。模拟器遵循提供的 Firebase 安全规则,但在通常使用 IAM 的情况下(例如,设置 Cloud Functions 函数、调用服务帐号以及权限等),模拟器不可配置,并且将使用开发者机器上的全局可用帐号(类似于直接运行本地脚本)。

内存和处理器限制

模拟器不会针对函数强制执行内存和处理器限制。不过,模拟器确实会通过 timeoutSeconds 运行时参数支持超时函数。

请注意,在模拟器中运行函数时,函数的执行时间可能与生产环境中的不同。我们建议您在使用模拟器完成函数设计和测试后,在生产环境中运行有限的测试以确认执行时间。

针对本地环境和生产环境的差异制定计划

由于模拟器是在本地机器上运行,因此它依赖本地环境运行应用以及内置程序和实用程序。

请注意,用于函数开发的本地环境可能与 Google 生产环境不同:

  • 您在本地安装的、用于模拟生产环境的应用(例如此教程中的 ImageMagick)的行为可能与在生产环境中的行为有所不同,尤其是在您需要其他版本或在非 Linux 环境中进行开发时。不妨将所缺失程序的您自己的二进制文件副本与您的函数一同部署。

  • 同样的,内置的实用程序(如 lsmkdir 等 shell 命令)可能与生产环境中的可用版本不同,尤其是当您在非 Linux 环境(例如 macOS)中进行开发时。要解决此问题,您可以使用原生命令的纯节点替代方案,或构建 Linux 二进制文件与您的部署捆绑。

重试

Cloud Functions 模拟器不支持在失败后重新执行函数。

后续步骤