gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:03 25 4
gpt4 key购买 nike

因此,我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com