首页 > 解决方案 > 在本地托管的 Firebase 应用程序中使用本地模拟的 https.onCall Firebase 函数

问题描述

我正在客户端使用节点 SDK 和 vanilla JavaScript 编写 Firebase 应用程序。我正在使用 Firebase Cloud Functions 来实现一个服务器,该服务器接收对我的页面路由的请求并使用该https.onRequest方法返回呈现的 HTML。我还使用 Cloud Functions 来处理与该https.onCall方法的客户端-服务器交互。

firebase serve我使用命令在本地开发。在本地开发时,我的客户端似乎忽略了我的本地onCall函数,而是调用已部署onCall函数的路由。我被迫部署我的onCall功能以便在本地查看更改。如果我不部署每个更改,我的本地应用程序将不会显示对onCall功能的任何更改。无论我跑步firebase serve还是跑步都会发生这种情况firebase serve --only=hosting,functions

当我在本地运行我的应用程序时firebase serve,页面通常托管在localhost:5000. 函数托管在localhost:5001. 如果我在这些本地托管页面之一上调用云功能,例如firebase.functions().httpsCallable('functionName')并检查我的开发人员工具中的网络面板,我可以看到请求 URL 是https://us-central1-<app-name>.cloudfunctions.net/<functionName>,而不是localhost:5001/<app-name>/us-central1/<functionName>

这让我很沮丧,因为这意味着我必须部署我的函数来测试每个更改,而不是通过我本地托管的 Web 应用程序测试我的本地函数。

我是否配置错误?如何让我的本地托管应用程序使用我本地模拟的onCall云功能?

我没有制作单页应用程序或使用任何视图框架。

标签: firebasegoogle-cloud-platformgoogle-cloud-functions

解决方案


Firebase 似乎还没有实现指向本地服务器的解决方案,所以我想出了一个小技巧。在初始化 Firebase 项目的位置包含以下代码段。希望能帮助到你!

if (process.env.NODE_ENV === 'development') {
  firebase.functions()._url = function (name) {
    return `${process.env.API_URL}/${name}`
  }
}

编辑:就像下面评论的goker.cebeci一样,连接到本地模拟器的正确方法是使用functions.useFunctionsEmulator('http://localhost:5001')(更改http://localhost:5001为本地模拟器运行的任何地址)

更新后的代码如下所示:

if (process.env.NODE_ENV === 'development') {
  const functions = firebase.functions()
  functions.useFunctionsEmulator('http://localhost:5001')
}

推荐阅读