【问题标题】:How to create a dev environment with FireStore & Cloud functions如何使用 FireStore 和 Cloud 功能创建开发环境
【发布时间】:2023-04-01 04:15:02
【问题描述】:

我一直在广泛使用 FireStore 和云功能,到目前为止一切都很好。

随着我的 Swift 应用程序接近生产发布,我想构建一个单独的开发环境。根据文档,我能够:

  • 创建两个单独的项目
  • 使用各种 GoogleService p-list 将这两个项目链接到我的 2 个目标
  • 我还能够为我的 Firebase Function 环境声明 2 个服务帐户并创建两个单独的别名。

这一切似乎都有效,除了我的新 Dev Cloud Function 环境没有与我的 Dev FireStore 数据库完全链接,而是似乎仍然链接到我的初始 FireStore 数据库实例 - 当我在上面写东西时,云功能被正确触发,但所有数据检索函数都返回空(好像 .get() 命令针对的是我的“旧”产品数据库)。

您能否告诉我如何“强制”我的 Dev Cloud Functions 环境与我的 Dev FireStore 数据库实例链接?我一定错过了一步 - 例如,我没有重新初始化 CLI/重新登录等,但只创建了第二个别名。

我还收到此消息:“未配置计费帐户。无法访问外部网络并且配额受到严重限制。配置计费帐户以删除这些限制”。这很奇怪,因为我没有使用外部帐户(仅限 Firestore/Cloud Functions/FCM)。

您可以指出的任何文档/分步指南都会非常有帮助!

这是我如何初始化我的 2 个应用程序:

const functions = require('firebase-functions');

const admin = require('firebase-admin');

var serviceAccount = require("./adminKey.json");
var serviceAccountDev = require("./adminKey-dev.json");

var secondEnvironment = admin.initializeApp({
  credential: admin.credential.cert(serviceAccountDev),
  databaseURL: "https://<app name>-dev.firebaseio.com"
}, 'dev instance');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<app name>.firebaseio.com"
});

var db = admin.firestore();

再次感谢, 弗朗索瓦

【问题讨论】:

    标签: swift firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    更新基于下面的 cmets 以及使用您初始化应用程序的 Cloud Function 代码部分更新您的帖子:

    通过执行以下操作:

    var secondEnvironment = admin.initializeApp({
      credential: admin.credential.cert(serviceAccountDev),
      databaseURL: "https://<app name>-dev.firebaseio.com"
    }, 'dev instance');
    
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      databaseURL: "https://<app name>.firebaseio.com"
    });
    

    您正在使用两个环境的 Prod 环境参数初始化应用程序。

    您应该按照本文档项底部的说明进行操作:https://firebase.google.com/docs/functions/config-env#automatically_populated_environment_variables

    这是:

    如果您需要使用服务帐户凭据使用默认项目配置初始化 Admin SDK,您可以从文件加载凭据并将其添加到 FIREBASE_CONFIG,如下所示:

    serviceAccount = require('./serviceAccount.json');

    const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG); adminConfig.credential = admin.credential.cert(serviceAccount); admin.initializeApp(adminConfig);

    process.env.FIREBASE_CONFIG 是在函数运行时自动填充的环境变量。


    (最初的答案,不再与您的确切问题完全相关......)

    如果我理解得很好,您只需在 CLI 中使用 use 命令切换到您要为其部署云功能的目标项目。这是为了以防您登录的用户正在管理两个项目(开发和生产)。

    如果两个不同的用户管理这两个项目,您必须使用logout 命令,然后使用login 命令才能使用正确的用户登录(如果该用户可能随后使用use 命令管理多个项目)。

    在此处查看文档:https://firebase.google.com/docs/cli/#administrative_commands

    【讨论】:

    • 谢谢雷诺!是的,这就是我所做的——我基本上使用 use 命令来决定在哪个环境中部署我的代码。这很好用,但是我的新开发环境中的云功能并没有被我的 Dev Firestore DB 触发...
    • @Franc 你在 Dev env 的 Cloud Functions 日志中看到什么了吗?
    • 抱歉延迟回来,我试图更深入地测试。云功能被正确触发,它失败的地方是当我询问它时(例如,使用.get())读取我的firestore DB上的值。该代码与我的 prod 环境中的代码相同,因此我知道这不是编码问题。它还给了我一条奇怪的消息:“未配置计费帐户。无法访问外部网络并且配额受到严重限制。配置计费帐户以删除这些限制”。任何线索可能是什么?我将编辑我的原始帖子以反映我发现的内容。
    • 计费消息通常是当您的功能需要联系外部服务时(但您解释说您只是使用内部服务....)。您是否使用特定选项初始化 (admin.initializeApp())?也许如果您将功能代码添加到您的帖子中,您将能够找到原因......
    • 谢谢雷诺!是的,经过仔细检查,我觉得在初始化我的两个应用程序时我必须做错什么。我认为我缺少的是一个标志,让云函数知道它应该根据我使用的别名来初始化我的两个环境中的哪一个。我在上面添加了我的初始化代码。如果您能帮我快速回顾一下,那就太好了...非常感谢!
    猜你喜欢
    • 2018-09-19
    • 2022-10-05
    • 2020-11-08
    • 2011-02-27
    • 2022-09-25
    • 1970-01-01
    • 2018-07-16
    • 2019-02-06
    • 2020-10-15
    相关资源
    最近更新 更多