因此,我正在使用 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-collectionmessages
containing a single message document with arandomId
,如果您仅使用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/