【问题标题】:Run firebase functions emulator on database without database emulator (towards production cloud instead)在没有数据库模拟器的数据库上运行 firebase 函数模拟器(而不是面向生产云)
【发布时间】:2021-04-06 17:50:21
【问题描述】:

我在将 firebase 函数模拟器运行到生产数据库时遇到问题。我有一个尚未公开发布的项目,因此我可以在生产过程中产生任何负面影响。

我的项目仅使用实时数据库,它不使用 Firestore(因此关于 SO 的其他问题不相关)文档指出“Cloud Firestore 和实时数据库触发器已经有足够的凭据,并且不需要额外的设置。”所以据此,我不需要任何额外的设置来指向生产数据库。

根据 Firebase 上的所有文档,如果我只启动函数模拟器而不启动数据库模拟器,项目应该运行到真正的 firebase 数据库。这个警告似乎也这么说:

functions:以下模拟器未运行,从 Functions 模拟器调用这些服务将影响生产:auth、firestore、database、hosting、pubsub

但是,事实并非如此。相反,我收到以下错误:

functions[onGlobalClientRequest]:函数被忽略,因为数据库模拟器不存在或没有运行。

我已经阅读了 firebase 文档,除了不需要设置凭据外,没有真正提到任何内容(但我在运行函数模拟器之前使用export GOOGLE_APPLICATION_CREDENTIALS="/path/to/credentials.json" 设置凭据。)

onGlobalClientRequest 如下所示:

export const onGlobalClientRequest = functions.database
  .ref( client_requests_key + "/{pushedid}")
  .onCreate(
    async (
      snap: functions.database.DataSnapshot,
      context: functions.EventContext,
    ) => {
      ///.... code here...
    },
  );

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    实时数据库 (RTDB) 上的操作会触发相应项目中的函数。所以生产 RTDB 会触发你生产项目的函数,而仿真 RTDB 会触发仿真函数。

    如果您想使用模拟器在本地测试由 RTDB 操作触发的功能,您还必须使用 RTDB 模拟器。这在文档 here 中进行了解释。

    如果您只想测试 HTTP 可调用函数,那么您可以使用远程 RTDB。

    【讨论】:

    • 感谢您的回答,我已经阅读了您附加的链接,实际上看不到任何地方说函数模拟器只能与模拟数据库一起使用。附加的链接似乎只涉及如何模拟数据库,但我不想这样做。我不是说你错了,只是你附加的链接似乎没有明确表明函数只能在 RTDB 模拟器上运行。谢谢。
    【解决方案2】:

    本地模拟的 Firebase 函数将能够写入 Prod 数据库,但无法被生产数据库触发。

    这是来自 Google 员工的 SO answer,其中陈述了上述内容。

    另外,引用另一位 Google 员工的 SO answer 的话:

    一般来说,使用 emulators:start 的规则是我们全面地模拟正在运行的任何东西。因此,例如,如果您正在运行函数和数据库模拟器,则所有来自函数的写入(通过 admin.database().... 将被重定向到数据库模拟器。但写入 Firestore (admin.firestore()... ) 将尝试投入生产,因为该模拟器没有运行。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2017-03-03
      • 2018-04-11
      • 1970-01-01
      • 2018-04-29
      • 2020-08-20
      • 1970-01-01
      • 2019-11-14
      • 2020-01-28
      相关资源
      最近更新 更多