node.js - 当子文档或集合完成创建时,不会触发 firestore OnCreate

标签 node.js firebase google-cloud-platform google-cloud-firestore google-cloud-functions

因此,我正在使用 flutter 和 firebase 构建一个聊天应用程序,每当两个新用户第一次开始相互聊天时(每当其中一个用户发送第一条消息时),我需要触发一个功能,这样我就可以将该信息存储在某处,以便稍后将其作为聊天历史记录显示给用户(已联系过的人)。

所以我的数据树如下所示:'rooms/{roomId}/messages/{messageWithRandomId}'

从逻辑上讲,每当用户向另一个用户发送第一条消息时,都会创建房间文档以及包含带有 randomId 的单个消息文档的子集合“messages”。 `

我已经在房间的集合上设置了一个 OnCreate 监听器,每当我在“房间”下手动创建新文档时,它就会被触发。

但是当子集合创建同一文档时,它不会被触发。

所以我的代码如下所示:

export const testfunction = functions.firestore.document('rooms/{_someRoom}').onCreate(async (snapshot,context) => {

// the function Core
 }

最佳答案

It doesn't get triggered when that same document is created by the subcollection.

这是正常行为。

事实上,如果您直接在 messages 集合下使用完整路径 rooms/{roomId}/messages/{messageWithRandomId} 创建文档,不会创建中间文档(即不会创建 roomId 文档)。

所以,当你说:

the room document gets created along with the sub-collection messages containing a single message document with a randomId

,如果您仅使用randomId创建消息文档,实际上没有创建room文档,因此不会触发云功能

Firebase 控制台以斜体显示 roomId 房间“文档”作为一种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到 messageWithRandomId 消息文档,但 Firestore 数据库中不存在该房间文档。

<小时/>

让我们举一个更通用的示例:想象一下 col1 集合下的 doc1 文档

col1/doc1/

以及 subCol1(子)集合下的另一个 subDoc1

col1/doc1/subCol1/subDoc1

实际上,从技术角度来看,它们彼此之间根本没有关系。它们只是共享路径的一部分,除此之外别无其他。这样做的一个副作用是,如果您删除文档,其子集合仍然存在。

<小时/>

这意味着您应该:

rooms 集合下创建自己的 roomId 文档

或者

通过以下方式触发您的云功能:

export const testfunction = functions.firestore.document('rooms/{_someRoom}/messages/{_someMessage}').onCreate(async (snapshot,context) => {
  //.....   
}

关于node.js - 当子文档或集合完成创建时,不会触发 firestore OnCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56761254/

相关文章:

typescript - 无法访问 Firebase Functions 项目中的全局方法

android - 添加 firebase_database 依赖项后,Flutter 应用程序不会停止安装

java - Google App Engine - 数据存储 java.lang.IllegalArgumentException : entity is too big

google-app-engine - 是否可以在 App Engine 标准环境中使用 Google Cloud CDN?

sql - 使用jdbc River将多个表从MySQL索引到elasticsearch

android - 为 firebase-ui-auth :2. 3.0 添加依赖项时出错

javascript - Node.js 无法处理多个 tcp 消息

java - com.google.cloud.storage.StorageImpl 的 clojure java 互操作

node.js - npm 命令行工具的状态保存在哪里?

javascript - Angular 6 错误 ReferenceError : "process is not defined" with elasticsearch js