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

Node.js 当子文档或集合完成创建时,不会触发firestore OnCreate,node.js,typescript,firebase,google-cloud-firestore,google-cloud-functions,Node.js,Typescript,Firebase,Google Cloud Firestore,Google Cloud Functions,因此,我正在使用Flatter和firebase构建一个聊天应用程序,每当两个新用户第一次开始聊天时(当其中一个发送第一条消息时),我需要触发一个功能,这样我就可以将该信息存储在某个地方,以便稍后将其显示为聊天历史记录(与我有过联系的人) 所以我的数据树是这样的:'rooms/{roomId}/messages/{messageWithRandomId}' 从逻辑上讲,每当一个用户向另一个用户发送第一条消息时,就会创建文件室文档以及包含一个带有randomId的消息文档的子集合“messages

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

所以我的数据树是这样的:'rooms/{roomId}/messages/{messageWithRandomId}'

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

我在文件室的集合上设置了OnCreate侦听器,每当我在“文件室”下手动创建新文档时,它就会被触发

但是,当子集合创建相同的文档时,不会触发它

因此,我的代码如下所示:

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

// the function Core
 }
当相同的文档由 次收集

这是正常的行为

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

所以,当你说:

room
文档与子集合一起创建
消息
包含带有
随机ID的单个消息文档

,如果您只创建了带有
随机ID的消息文档,实际上没有创建
文件室
文档,因此不会触发云功能

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


让我们举一个更一般的例子:想象一下
col1
集合下的
doc1
文档

col1/doc1/
col1/doc1/subCol1/subDoc1
以及subCol1(sub-)集合下的另一个子文档1

col1/doc1/
col1/doc1/subCol1/subDoc1
实际上,从技术角度来看,它们之间根本没有联系。它们只是分享了它们的一部分,而没有其他东西。这样做的一个副作用是,如果删除文档,其子集合仍然存在


这意味着您应该:

rooms
集合下自己创建
roomId
文档

col1/doc1/
col1/doc1/subCol1/subDoc1

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

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

感谢您的快速回复和清晰解释:)