首页 > 解决方案 > 从 GCP Console 部署 Cloud Firestore 触发器功能

问题描述

我有一个在我的云 Firestore 数据库的 onUpdate 触发器上触发的函数。更改数据库时根本没有调用该函数。

我没有使用 firestore CLI 部署该功能,而是使用 GCP Console 部署它。

这是功能:

exports.NotificationListener = functions
    .firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      const userId = context.params.userId.toString();
      const eventId = context.eventId;
      console.log('EventId:' + eventId);
      console.log('Change in:' + userId);
      return 200;
    });

这是来自 GCP 控制台的部署信息(显示触发器): 部署信息。

最后,这是 Cloud Firestore 架构: Firestore 架构

我想监视集合中任何“USER”的任何更改:“/user”,因此我使用“user/{userId}”。

为什么更改数据库时不调用此函数?

编辑 1

关于我的环境的一些信息:

我将整个项目核心放在一个 TypeScript 文件中。我有超过 40 个 HTTPS 触发功能,目前在线。

我在我的 TS 文件中添加了一个新函数,然后我npm run build编译并获取了 JS 文件。

最后,我去 Google Cloud Console 创建一个函数并选择“Zip Upload”并上传编译好的 JS 文件(显然,还有获取数据库 URL、身份验证等所需的 JSON 文件)

这种方法非常有效,至少对于 HTTP 触发的 firestore 函数来说是这样。

现在我对触发器重复了与上述相同的步骤,onUpdate只是没有选择 HTTP 触发器,而是选择了Cloud Firestore触发器。触发信息可以在上面的屏幕截图中找到。

onUpdate 不会在数据库更改时触发。

编辑 2

我的事件触发函数NotificationListener与其他 40 个 HTTPS 函数一起显示在 firebase 控制台函数列表中。但它没有被调用。

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


@doug-stevenson,您的答案似乎消失了,我不知道为什么。

无论如何,我找到了它不起作用的原因。

我的 firebase 数据库位于项目“Placeholder 1”中,而我的 GCP 功能位于项目“Placeholder 2”中。现在,我可以使用 firabse-functions API 从 GCP 函数(在“Placeholder 2”中)更新“Placeholder 1”数据库,因为我将 DatabaseURL 设置为“Placeholder 1”。

但是,如果您想监听数据库进行更改,仅将 DatabaseURL 设置为所需的数据库是行不通的。您实际上需要在同一个项目中拥有该功能,否则它无法订阅和侦听事件。

我认为您可以从不同的项目读取/写入数据库有点不一致,但是要监听事件,函数需要在同一个项目中。或者,也许我错过了一些基本的东西,导致我感到困惑。


推荐阅读