Node.js 当子文档或集合完成创建时,不会触发firestore OnCreate
因此,我正在使用Flatter和firebase构建一个聊天应用程序,每当两个新用户第一次开始聊天时(当其中一个发送第一条消息时),我需要触发一个功能,这样我就可以将该信息存储在某个地方,以便稍后将其显示为聊天历史记录(与我有过联系的人) 所以我的数据树是这样的:'rooms/{roomId}/messages/{messageWithRandomId}' 从逻辑上讲,每当一个用户向另一个用户发送第一条消息时,就会创建文件室文档以及包含一个带有randomId的消息文档的子集合“messages”。 ` 我在文件室的集合上设置了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
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) => {
//.....
}
感谢您的快速回复和清晰解释:)